PAT乙 1056 組合數的和

2021-08-18 18:00:58 字數 882 閱讀 8488

題目描述:

給定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。...