題目描述:
給定n個非0的個位數字,用其中任意2個數字都可以組合成1個2位的數字。要求所有可能組合出來的2位數字的和。例如給定2、5、8,則可以組合出:25、28、52、58、82、85,它們的和為330。
輸入格式:
輸入在一行中先給出n(1輸出格式:
輸出所有可能組合出來的2位數字的和。
輸入樣例:
3 2 8 5輸出樣例:
330求解思路:
對於該問題,最一般的思路就是將任意兩個數字組合,通過兩個for迴圈來達到求和的效果,但是該方案的時間複雜度為o(n^2),這顯然是不夠效率的。
而我們發現,對於該輸入樣例 2 5 8,任意乙個數字在十位和個位都會出現2次,如果輸入樣例為4個,假設為2 5 8 9,易得每個數字在十位和個位都會出現3次,於是推廣到一般情況,對n個數字,每個數字都會在十位和個位出現n-1次。
另外由於組成的是2位數,所以對數字2和5而言,其實25 = 2*10 + 5*1, 52 = 5*10 +2*1, 25+52 = (2+5)*10 + (2+5)*1 = (2+5)*11。於是稍加總結就可以推出一般求和公式:
sum = numsum * powsum * (n-1)
其中numsum是所有數字的和, powsum是各位權重之和,這裡是11。
事實上,該公式對任意m個數組成的m位整數都是成立的,且時間複雜度為o(n)
#include #include using namespace std;
int main(int argc, char const *argv)
cout << (n-1) * numsum * powsum;
return 0;
}
PAT 1056 組合數的和
給定n個非0的個位數字,用其中任意2個數字都可以組合成1個2位的數字。要求所有可能組合出來的2位數字的和。例如給定2 5 8,則可以組合出 25 28 52 58 82 85,它們的和為330。輸入格式 輸入在一行中先給出n 1輸出格式 輸出所有可能組合出來的2位數字的和。輸入樣例 3 2 8 5輸...
PAT 1056 組合數的和
1056 組合數的和 15 分 給定 n 個非 0 的個位數字,用其中任意 2 個數字都可以組合成 1 個 2 位的數字。要求所有可能組合出來的 2 位數字的和。例如給定 2 5 8,則可以組合出 25 28 52 58 82 85,它們的和為330。輸入格式 輸入在第一行中給出 n 1 n 10 ...
PAT 1056組合數的和
pat 1056 組合數的和 15分 雖然這題不難,但是還是想寫一下 題目描述 給定 n 個非 0 的個位數字,用其中任意 2 個數字都可以組合成 1 個 2 位的數字。要求所有可能組合出來的 2 位數字的和。例如給定 2 5 8,則可以組合出 25 28 52 58 82 85,它們的和為330。...