本文整理自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; }