c语言 高精度乘法总是超时………………
#include<stdio.h>longlongvd(longlonga[1251]){inti=0,j=0;charstr[10001]={'\0'};scanf("...
#include <stdio.h>
long long vd(long long a[1251])
{
int i=0,j=0;
char str[10001]={'\0'};
scanf("%s",str);
while(str[i]!='\0')
{
i=i+1;
}
if(i%8==0)//////////////
{
for(j=0;j<i/8;j++)
{
a[j]=str[i-j*8-1]-48+(str[i-j*8-2]-48)*10+(str[i-j*8-3]-48)*100+(str[i-j*8-4]-48)*1000+(str[i-j*8-5]-48)*10000+(str[i-j*8-6]-48)*100000+(str[i-j*8-7]-48)*1000000+(str[i-j*8-8]-48)*10000000;
}
j=j-1;
}
else
{
for(j=0;j<i/8;j++)
{
a[j]=str[i-j*8-1]-48+(str[i-j*8-2]-48)*10+(str[i-j*8-3]-48)*100+(str[i-j*8-4]-48)*1000+(str[i-j*8-5]-48)*10000+(str[i-j*8-6]-48)*100000+(str[i-j*8-7]-48)*1000000+(str[i-j*8-8]-48)*10000000;
}
if(i%8==1)
{a[j]=(str[0]-48);}
if(i%8==2)
{a[j]=(str[0]-48)*10+(str[1]-48);}
if(i%8==3)
{a[j]=(str[0]-48)*100+(str[1]-48)*10+(str[2]-48);}
if(i%8==4)
{a[j]=(str[0]-48)*1000+(str[1]-48)*100+(str[2]-48)*10+(str[3]-48);}
if(i%8==5)
{a[j]=(str[0]-48)*10000+(str[1]-48)*1000+(str[2]-48)*100+(str[3]-48)*10+(str[4]-48);}
if(i%8==6)
{a[j]=(str[0]-48)*100000+(str[1]-48)*10000+(str[2]-48)*1000+(str[3]-48)*100+(str[4]-48)*10+(str[5]-48);}
if(i%8==7)
{a[j]=(str[0]-48)*1000000+(str[1]-48)*100000+(str[2]-48)*10000+(str[3]-48)*1000+(str[4]-48)*100+(str[5]-48)*10+(str[6]-48);}
}
return j;
}
int main()
{
long long a[1251]={0},a1,a2;
long long b[1251]={0},b1,b2;
long long c[2501]={0};
long long q;
a1=vd(a);
b1=vd(b);
for(a2=0;a2<=a1;a2++)
{
for(b2=0;b2<=b1;b2++)
{
c[a2+b2]=a[a2]*b[b2]+c[a2+b2];
if(c[a2+b2]>99999999)
{
c[a2+b2+1]=c[a2+b2]/100000000+c[a2+b2+1];
c[a2+b2]=c[a2+b2]%100000000;
if(c[a2+b2+1]>99999999)
{
c[a2+b2+2]=c[a2+b2+1]/100000000+c[a2+b2+2];
c[a2+b2+1]=c[a2+b2+1]%100000000;
}
}
}
}
for(q=a1+b1+1;q>=0;q--)
{
if(c[q]==0&&c[q-1]==0&&q-1>=0)
{printf("00000000");}
if(c[q]!=0)
{
printf("%lld",c[q]);
if(c[q-1]<10000000&&c[q-1]>999999&&q-1>=0)
{printf("0");q=q-1;}
if(c[q-1]<1000000&&c[q-1]>99999&&q-1>=0)
{printf("00");q=q-1;}
if(c[q-1]<100000&&c[q-1]>9999&&q-1>=0)
{printf("000");q=q-1;}
if(c[q-1]<10000&&c[q-1]>999&&q-1>=0)
{printf("0000");q=q-1;}
if(c[q-1]<1000&&c[q-1]>99&&q-1>=0)
{printf("00000");q=q-1;}
if(c[q-1]<100&&c[q-1]>9&&q-1>=0)
{printf("000000");q=q-1;}
if(c[q-1]<10&&c[q-1]>0&&q-1>=0)
{printf("0000000");q=q-1;}
if(c[q-1]==0&&q-1>=0)
{printf("00000000");q=q-1;}
}
}
printf("\n");
return 0;
}
抱歉实在没分了 展开
long long vd(long long a[1251])
{
int i=0,j=0;
char str[10001]={'\0'};
scanf("%s",str);
while(str[i]!='\0')
{
i=i+1;
}
if(i%8==0)//////////////
{
for(j=0;j<i/8;j++)
{
a[j]=str[i-j*8-1]-48+(str[i-j*8-2]-48)*10+(str[i-j*8-3]-48)*100+(str[i-j*8-4]-48)*1000+(str[i-j*8-5]-48)*10000+(str[i-j*8-6]-48)*100000+(str[i-j*8-7]-48)*1000000+(str[i-j*8-8]-48)*10000000;
}
j=j-1;
}
else
{
for(j=0;j<i/8;j++)
{
a[j]=str[i-j*8-1]-48+(str[i-j*8-2]-48)*10+(str[i-j*8-3]-48)*100+(str[i-j*8-4]-48)*1000+(str[i-j*8-5]-48)*10000+(str[i-j*8-6]-48)*100000+(str[i-j*8-7]-48)*1000000+(str[i-j*8-8]-48)*10000000;
}
if(i%8==1)
{a[j]=(str[0]-48);}
if(i%8==2)
{a[j]=(str[0]-48)*10+(str[1]-48);}
if(i%8==3)
{a[j]=(str[0]-48)*100+(str[1]-48)*10+(str[2]-48);}
if(i%8==4)
{a[j]=(str[0]-48)*1000+(str[1]-48)*100+(str[2]-48)*10+(str[3]-48);}
if(i%8==5)
{a[j]=(str[0]-48)*10000+(str[1]-48)*1000+(str[2]-48)*100+(str[3]-48)*10+(str[4]-48);}
if(i%8==6)
{a[j]=(str[0]-48)*100000+(str[1]-48)*10000+(str[2]-48)*1000+(str[3]-48)*100+(str[4]-48)*10+(str[5]-48);}
if(i%8==7)
{a[j]=(str[0]-48)*1000000+(str[1]-48)*100000+(str[2]-48)*10000+(str[3]-48)*1000+(str[4]-48)*100+(str[5]-48)*10+(str[6]-48);}
}
return j;
}
int main()
{
long long a[1251]={0},a1,a2;
long long b[1251]={0},b1,b2;
long long c[2501]={0};
long long q;
a1=vd(a);
b1=vd(b);
for(a2=0;a2<=a1;a2++)
{
for(b2=0;b2<=b1;b2++)
{
c[a2+b2]=a[a2]*b[b2]+c[a2+b2];
if(c[a2+b2]>99999999)
{
c[a2+b2+1]=c[a2+b2]/100000000+c[a2+b2+1];
c[a2+b2]=c[a2+b2]%100000000;
if(c[a2+b2+1]>99999999)
{
c[a2+b2+2]=c[a2+b2+1]/100000000+c[a2+b2+2];
c[a2+b2+1]=c[a2+b2+1]%100000000;
}
}
}
}
for(q=a1+b1+1;q>=0;q--)
{
if(c[q]==0&&c[q-1]==0&&q-1>=0)
{printf("00000000");}
if(c[q]!=0)
{
printf("%lld",c[q]);
if(c[q-1]<10000000&&c[q-1]>999999&&q-1>=0)
{printf("0");q=q-1;}
if(c[q-1]<1000000&&c[q-1]>99999&&q-1>=0)
{printf("00");q=q-1;}
if(c[q-1]<100000&&c[q-1]>9999&&q-1>=0)
{printf("000");q=q-1;}
if(c[q-1]<10000&&c[q-1]>999&&q-1>=0)
{printf("0000");q=q-1;}
if(c[q-1]<1000&&c[q-1]>99&&q-1>=0)
{printf("00000");q=q-1;}
if(c[q-1]<100&&c[q-1]>9&&q-1>=0)
{printf("000000");q=q-1;}
if(c[q-1]<10&&c[q-1]>0&&q-1>=0)
{printf("0000000");q=q-1;}
if(c[q-1]==0&&q-1>=0)
{printf("00000000");q=q-1;}
}
}
printf("\n");
return 0;
}
抱歉实在没分了 展开
3个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询