大数的加法运算:
大数的加法就是利用字符串输入然后转化为两个数组,然后相加存入另一个数组,如果大于10就要进一。
程序代码:
#include<stdio.h> #include<string.h> char s1[5000],s2[5000]; int a[5000],b[5000],c[10000]; int main() { int i,j,k,n,m,t; while(scanf("%s%s",s1,s2)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); n=strlen(s1); m=strlen(s2); k=0; for(i=n-1;i>=0;i--) a[k++]=s1[i]-'0'; k=0; for(i=m-1;i>=0;i--) b[k++]=s2[i]-'0'; if(n<m) k=m; else k=n; t=k; for(i=0;i<k;i++) { c[i]=a[i]+b[i]+c[i]; if(c[i]>=10) { c[i]=c[i]%10; c[i+1]=1; if(i+1==k) t=k+1; } } for(i=t-1;i>=0;i--) printf("%d",c[i]); printf("\n"); } return 0; }
大数减法:
大数减法要保证大的减去小的,然后先比较大小写一个函数利用减法运算,运算时减不够的前位减1,后位加10.
程序代码:
#include<stdio.h> #include<string.h> char s[5000],s1[50000]; int a[50000],b[50000],c[50000]; void sub(int x[],int y[],int z) { int i; for(i=0;i<z;i++) { c[i]=x[i]-y[i]+c[i]; if(c[i]<0) { c[i]=10+c[i]; c[i+1]=-1; } } for(i=z-1;i>=0;i--) { if(c[i]==0) z--; else break; } for(i=z-1;i>=0;i--) printf("%d",c[i]); printf("\n"); } int main() { int i,j,k,n,m,t; while(scanf("%s%s",s,s1)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); n=strlen(s); m=strlen(s1); k=0; for(i=n-1;i>=0;i--) a[k++]=s[i]-'0'; k=0; for(i=m-1;i>=0;i--) b[k++]=s1[i]-'0'; if(n>m) sub(a,b,n); else if(n<m) { printf("-"); sub(b,a,m); } else { for(i=0;i<n;i++) { if(a[i]==b[i]) continue; else if(a[i]>b[i]) { sub(a,b,n); break; } else { printf("-"); sub(b,a,n); break; } } } } return 0; }
大数乘法:
大数乘法跟大数加法类似,先乘后加,就是让每一次乘得的结果先存储到数组里面,因为两个数相乘最大位数也不过两个数的长度。
程序代码:
#include<stdio.h> #include<string.h> char s[5000],s1[5000]; int a[5000],b[5000],c[5000]; int main() { int i,j,k,t,n,m,sum; while(scanf("%s%s",s,s1)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); n=strlen(s); m=strlen(s1); sum=n+m; k=0; for(i=n-1;i>=0;i--) a[k++]=s[i]-'0'; k=0; for(i=m-1;i>=0;i--) b[k++]=s1[i]-'0'; for(i=0;i<n;i++) for(j=0;j<m;j++) c[i+j]=c[i+j]+a[i]*b[j]; for(i=0;i<sum;i++) { if(c[i]>=10) c[i+1]=c[i+1]+c[i]/10; c[i]=c[i]%10; } for(i=sum-1;i>0;i--) { if(c[i]==0) continue; else break; } while(i>=0) { printf("%d",c[i]); i--; } printf("\n"); } return 0; }
大数幂:
大数幂也可以看成是大数乘法,可以把每一次乘得的结果作为每一次底数乘对象,然后循环n-1次。
程序代码:
#include<stdio.h> #include<string.h> char s[20]; int a[500000],b[500000]; int count=0; void cheng(int a[],int b[],int m); int main() { int i,k,j,n,m; while(scanf("%s%d",s,&n)!=EOF) { if(s[0]=='0'&&n==0) break; if(n==0) { printf("1\n"); continue; } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); m=strlen(s); j=k=0; for(i=m-1;i>=0;i--) { a[k++]=s[i]-'0'; b[j++]=s[i]-'0'; } n--; while(n) { cheng(a,b,m); n--; } for(i=1005;i>0;i--) { if(b[i]==0) continue; else break; } while(i>=0) { printf("%d",b[i]); i--; } printf("\n"); } return 0; } void cheng(int a[],int b[],int m) { int i,j,k; int c[5000]; memset(c,0,sizeof(c)); for(i=0;i<m;i++) for(j=0;j<1005;j++) { c[i+j]=c[i+j]+a[i]*b[j]; } for(i=0;i<1005;i++) { if(c[i]>=10) c[i+1]=c[i+1]+c[i]/10; b[i]=c[i]%10; } }
大数除法:
这里由于大数除法比较麻烦,后面会接着有大数求余和大数阶层的时候详细讲解, 见谅!!!!!