ZCMU-1180(大数相乘)
2017-01-06 10:03
337 查看
1180: a1*a2*a3*...*an
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 286 Solved: 88
[Submit][Status][Web
Board]
Description
求a1*a2*a3*...*an的值Input
第一行一个整数T,表示接下来有T行每行一个正整数是N,然后是N个正整数a1,a2,a3...an,(0<N<1000,0<=a1<10000)
Output
输出值Sample Input
25 1 2 3 4 5
4 1000 1000 1000 1000
Sample Output
1201000000000000
【解析】
此题就是运用大数相乘的原理做的。不过在做这道题之前,我还不会....原理很简单,两者之间相乘,低位放在下标
小的地方,高位放在下标大的地方,如果有进位那就加上进位的那个数,保证数组中的每一个元素对应一个位。
#include<cstdio> #include<cstring> using namespace std; int main() { int i,t,n,j,flag,temp,jinwei,length; scanf("%d",&t); while(t--) { flag=0; jinwei=0; length=1; scanf("%d",&n); int num ; int sum[10000]={1}; for(i=0;i<n;i++) { scanf("%d",&num[i]); if(num[i]==0) { flag=1; } } if(flag==1) { printf("0\n"); continue; } else { for(i=0;i&l c7e9 t;n;i++) { for(j=0;j<length;j++) { temp=sum[j]*num[i]+jinwei;//两者先乘 sum[j]=temp%10;//然后这里其实做的就是把低位给了下标小的。假设我们之前是1 5 40 jinwei=temp/10;//那么这里就是变成了200%10,所以sum[0]为0此时jinwei变成了20 }//在while循环里面sum[1]为0,sum[2]变成2了。这里只是举个例子 while(jinwei>0) { sum[length++]=jinwei%10; jinwei/=10; } } for(j=length-1;j>=0;j--) { printf("%d",sum[j]); } printf("\n"); } } return 0; }