题目描述
题目大意
n n 个数相乘,求积
解题思路
这道题描述有毒。。。
写成了1024,搞得我打了一个30分的高精乘单精。。。
30分代码
#include<cstdio>
#define mod 100000000
#define M 400
using namespace std;long long ans[M+1],x;
int n,j;
void mul(long long x)
{
long long g=0;
for(int j=M;j>0;j--)
{
long long d=ans[j]*x+g;
ans[j]=d%mod;
g=d/mod;
}
return;
}
int main()
{
scanf("%d",&n);
ans[M]=1;
while(n--) scanf("%lld",&x),mul(x);
for(j=1;!ans[j];j++);printf("%lld",ans[j]);
for(int i=j+1;i<=M;i++)
{
if(ans[i]<1e7) putchar(48);
if(ans[i]<1e6) putchar(48);
if(ans[i]<1e5) putchar(48);
if(ans[i]<1e4) putchar(48);
if(ans[i]<1e3) putchar(48);
if(ans[i]<1e2) putchar(48);
if(ans[i]<1e1) putchar(48);
printf("%lld",ans[i]);
}
}
100分代码
#include<cstdio>
#include<cstring>
#define M 2501
using namespace std;int ans[M+1],x,b[51],c[M+1];
char yc[51];
int n,j;
void mul()
{
int len;
for(len=M;!ans[len];len--);
for(int i=1;i<=M;i++) {c[i]=ans[i];ans[i]=0;}
int m=strlen(yc);
for(int i=0;i<m;i++) b[m-i]=yc[i]-48;
for(int i=1;i<=len;i++)
{
int g=0;
for (j=1;j<=m;j++)
{
ans[i+j-1]=c[i]*b[j]+g+ans[i+j-1];
g=ans[i+j-1]/10;
ans[i+j-1]%=10;
}
ans[i+m]=g;
}
return;
}
int main()
{
scanf("%d",&n); ans[1]=1;
while(n--)
{
scanf("%s",yc);
mul();
}
for(j=M;!ans[j]&&j>1;j--);
for(int i=j;i>0;i--) putchar(ans[i]+48);
}