给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。
输入格式:
输入在一行中先给出 N(1 < N < 10),随后给出 N 个不同的非 0 个位数字。数字间以空格分隔。
输出格式:
输出所有可能组合出来的2位数字的和。
输入样例:
3 2 8 5
输出样例:
330
分析:只有两位的整数,个位和十位,注意:不要掉入题目的思维陷阱(出题有点阴啊233),题目说所以组合出来的数的和,很容易误导人去想排列出所有结果然后加起来,呕吼,如果掉到这个坑就shit了。且看规律打法,如:
2,5,8,可以组合出:25、28、52、58、82、85,他们的和大家都会求,但是恰恰是利用了加法的基本原则,且看25+28+52+58+82+85=20*2+50*2+80*2+(5+8)+(2+8)+(2+5)=(20+50+80)*2+(2+5+8)*2,看出来没鸭?
每个数字当10位可以当3-1=2次,当个位也是3-1=2次,所有最后的和就=(20+50+80)*2+(2+5+8)*2,再化简=(2+5+8)*10*2+(2+5+8)*2=(2+5+8)*2*11,总结公式:输入n个数 sum为n个数的和 则最后的答案=sum*(n-1)*11
赶紧AC这个小阴货
代码:
#include<iostream> using namespace std; int main() { int n; while (cin >> n) { int x, ans,sum = 0; int t = n; while (t--) { cin >> x; sum += x; } ans = (n - 1) * 11 * sum; cout <<ans<<endl; } return 0; }