1056 组合数的和
给定 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
题解:这道题看上去很想使用暴力,然后一看数据量N(1 < N < 10),果断暴力,省时又好做。 但是写博客的时候,又会想到,假如数据量大一些,该怎么办?稍加思索,便可以很轻易得到第二种解法:直接求出各个数的和,将这个数×n-1×11,这个的意义是,每一个数都会与其他任意一个数组合在一起,充当十位或个位,那么和便是×11的结果,n-1是每一个数与其他n-1个数有组合的情况。
暴力代码如下:
1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int n,ac = 0; 8 cin>>n; 9 int a[10]; 10 for( int i = 0; i < n; i++) cin>>a[i]; 11 for(int i = 0; i < n; i++) 12 { 13 for( int j = 0; j < n; j++) 14 { 15 if( i == j ) continue; 16 ac = a[i]*10+a[j]+ac; 17 } 18 } 19 cout<<ac; 20 return 0; 21 }
第二种方法代码如下:
1 #include<iostream> 2 3 using namespace std; 4 5 int main(){ 6 int n, sum = 0, m; 7 scanf("%d",&n); 8 for( int i = 0; i < n; i++){ 9 scanf("%d",&m); 10 sum += m; 11 } 12 printf("%d",sum*11*(n-1)); 13 }
原文地址:https://www.cnblogs.com/yxp400/p/9462342.html
时间: 2024-10-07 20:20:10