大数的四则运算
在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。
1.加法。
如:
Input: 123456789123456789123456789
1
Output:123456789123456789123456790
输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。
#include<stdio.h> #include<string.h> int max(int x,int y) { if(x>y) return x; else return y; } int main(void) { char str1[510],str2[510]; while(scanf("%s %s",str1,str2)==2) { int a[510]={0},b[510]={0},c[510]={0},i; int m,n,max1=0; m=strlen(str1); n=strlen(str2); max1=max(m,n); for(i=0;i<max1;i++) { a[m-i-1]=str1[i]-48; b[n-i-1]=str2[i]-48; } for(i=0;i<max1;i++) c[i]=a[i]+b[i]; for(i=0;i<max1;i++) { c[i+1]=c[i]/10+c[i+1]; c[i]=c[i]%10; } if(c[max1]!=0) { for(i=max1;i>=0;i--) printf("%d",c[i]); } else { for(i=max1-1;i>=0;i--) printf("%d",c[i]); } printf("\n"); } return0; }
2.减法
Input:123456789123456789
1
Output:123456789123456788
原理同加法一样(这里假设第一个数大于第二个数)
#include<stdio.h> #include<string.h> int main(void) { char s1[505],s2[505]; while(scanf("%s%s",s1,s2)==2) { int i,j,len1,len2; int a[105]={0},b[105]={0}; len1=strlen(s1); len2=strlen(s2); for(i=len1-1,j=0;i>=0;i--,j++) { a[j]=s1[i]-48; } for(i=len2-1,j=0;i>=0;i--,j++) { b[j]=s2[i]-48; } for(i=0;i<len1;i++) { a[i]=a[i]-b[i]; if(a[i]<0) { a[i]+=10; a[i+1]--; } } i=len1-1; while(a[i]==0) { i--; } for(;i>=0;i--) { printf("%d",a[i]); } printf("\n"); } return0; }
3.乘法
原理上也是采用数组模拟。
a[i] 12345
b[j] 23
用c[k]来保存每次的运算结果,k=i+j;
c[i+j]=c[i+j]+a[i]*b[j];
这里来模拟一次乘法过程:
123
* 12
--------------
246
+ 123
--------------
1476
#include<iostream> #include<string.h> usingnamespace std; int main(void) { char s1[510],s2[510],temp[510]; int a[510],b[510],c[1010]; while(scanf("%s%s",s1,s2)==2) { int i,j,h; int len1,len2; if(strlen(s1)<strlen(s2)) { strcpy(temp,s1); strcpy(s1,s2); strcpy(s2,temp); } len1=strlen(s1); len2=strlen(s2); memset(c,0,sizeof(c)); for(i=len1-1,j=0;i>=0;i--,j++) { a[j]=s1[i]-48; } for(i=len2-1,j=0;i>=0;i--,j++) { b[j]=s2[i]-48; } for(i=0;i<len2;i++) { for(j=0;j<len1;j++) { c[i+j]=a[j]*b[i]+c[i+j]; } } for(i=0;i<2*len1;i++) { if(c[i]>=10) { c[i+1]=c[i+1]+c[i]/10; c[i]=c[i]%10; } } i=2*len1; while(c[i]==0) { i--; } if(i<0) { printf("0\n"); } else { for(;i>=0;i--) printf("%d",c[i]); printf("\n"); } } return0; }
4.除法
除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。
#include<stdio.h> #include<string.h> int len1,len2; char s1[905]; char s2[905]; int re[905]; void sub() { int i=0; int j; while(1) { if(s1[i]=='0') i++; else { j=i; break; } } for(;i<len2;i++) { s1[i]=s1[i]-s2[i]+'0'; } for(i=len2-1;i>j;i--) //低位开始检测是否小于0 { if(s1[i]<'0') { s1[i]+=10; s1[i-1]--; } } } int main(void) { int i,p; while(scanf("%s%s",s1,s2)==2) { len1=strlen(s1); len2=strlen(s2); if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0)) //如果a<b,直接输出0 { printf("0\n"); continue; } p=0; while(1) { re[p]=0; while(strncmp(s1,s2,len2)>=0) //一直进行减法,直到不能减为止 { sub(); re[p]++; } p++; if(len1==len2) break; for(i=len2-1;i>=0;i--) //在s2前面补0,以便进行减法运算 { s2[i+1]=s2[i]; } s2[0]='0'; len2++; s2[len2]='\0'; } i=0; while(1) { if(re[i]==0) i++; else break; } for(;i<p;i++) printf("%d",re[i]); printf("\n"); } return0; }