ZCMU-1180(大数相乘)

来源:互联网 发布:mac开盖自动开机 编辑:程序博客网 时间:2024/06/07 03:48

1180: a1*a2*a3*...*an

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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

2
5 1 2 3 4 5
4 1000 1000 1000 1000

Sample Output

120
1000000000000

【解析】
此题就是运用大数相乘的原理做的。不过在做这道题之前,我还不会....原理很简单,两者之间相乘,低位放在下标
小的地方,高位放在下标大的地方,如果有进位那就加上进位的那个数,保证数组中的每一个元素对应一个位。
#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[n];        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<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;}

0 0
原创粉丝点击