本文整理自https://wenku.baidu.com/view/3600932bbc64783e0912a21614791711cc7979f5.html
1.大数:所有数据类型都无法定义的数。
2.大数的存放:(1)数组:1个1个存或n个n个存;(2)字符数组:一个数字作为一个字符。
3.大数加法:
input:
2
1 2
112233445566778899 998877665544332211
output:
Case 1:
1+2=3
Case 2:
112233445566778899+998877665544332211=1111111111111111110
#include<stdio.h> #include<string.h>
int main(){
char a[5001],b[5001];
int aa[5001],bb[5001],k,n=0;
scanf("%d",&k);
for(int c=1;c<=k;c++){
scanf("%s%s",a,b);
int alen=strlen(a);
int blen=strlen(b);
memset(aa,0,sizeof(aa));//清除aa里的数值,让其为0
memset(aa,0,sizeof(bb));
int maxlen=blen;
if(alen>blen) maxlen=alen;
for(int i=alen-1;i>=0;i--)
aa[alen-i]=a[i]-'0';
for(int i=blen-1;i>=0;i--)
bb[blen-i]=b[i]-'0';
for(int i=1;i<=maxlen;i++){
aa[i]+=bb[i];
if(aa[i]>9){
if(i==maxlen) maxlen++;
aa[i+1]++;
aa[i]-=10;
}
}
printf("Case %d:\n",++n);
printf("%s+%s=",a,b);
for(int i=maxlen;i>=1;i--)
printf("%d",aa[i]);
if(k==c) printf("\n");
else printf("\n\n")
}
return 0;
}4.大数减法:与加法类似
5.大数乘法:
input:
1 2
112233445566778899 998877665544332211
output:
Case 1:
12=3
Case 2:
112233445566778899998877665544332211=112107482103740987777903741240815689
#include<stdio.h> #include<string.h>
int main(){
int m,n,i,j,k,a[1000],b[1000],c[1000];
char a1[1000],b1[1000];
while(scanf("s%s%",a1,b1)!=EOF){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
m=strlen(a1);
n=strlen(b1);
for(j=0,i=m-1;i>=0;i--,j++)
a[j]=a1[i]-'0';
for(j=0,i=n-1;i>=0;i--,j++)
b[j]=b1[i]-'0';
for(i=0;i<n;i++)
for(j=0;j<m;j++)
c[i+j]+=a[j]*b[j];
for(i=0;i<n+m-2;i++)
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
if(c[m+n-2]==0)
printf("0");
else{
for(i=m+n-2;i>=0;i--)
printf("%d",c[i])
}
printf("\n");
}
return 0;
}6.大数阶乘:
input:1 2 3
output: 1 2 6
#include<stdio.h>
int main()
{
int a[100000];
int i,j,k,n,m,sum,b;
while(scanf("%d",&m)!=EOF){
a[0]=1;k=1;
for(i=2;i<=m;i++){
for(n=0,j=1;j<=k;j++){
sum=a[j-1]*i+n;
a[j-1]=sum%10;
n=sum/10;
}
while(n){
a[++k-1]=n%10;
n=n/10;
}
}
for(b=k;b>=1;--b)
printf("%d",a[b-1]);
printf("\n");
}
return 0;
}
京公网安备 11010502036488号