大数的四则运算(转)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/04/11/2012867.html
在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。
1.加法。
如:
Input: 123456789123456789123456789
1
Output:123456789123456789123456790
输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。
View Code
1 加法模板 2 3 #include<stdio.h> 4 #include<string.h> 5 int max(int x,int y) 6 { 7 if(x>y) 8 return x; 9 else 10 return y; 11 } 12 13 int main(void) 14 { 15 16 char str1[510],str2[510]; 17 while(scanf("%s %s",str1,str2)==2) 18 { 19 20 int a[510]={0},b[510]={0},c[510]={0},i; 21 int m,n,max1=0; 22 m=strlen(str1); 23 n=strlen(str2); 24 max1=max(m,n); 25 for(i=0;i<max1;i++) 26 { 27 a[m-i-1]=str1[i]-48; 28 b[n-i-1]=str2[i]-48; 29 } 30 for(i=0;i<max1;i++) 31 c[i]=a[i]+b[i]; 32 for(i=0;i<max1;i++) 33 { 34 c[i+1]=c[i]/10+c[i+1]; 35 c[i]=c[i]%10; 36 } 37 if(c[max1]!=0) 38 { 39 for(i=max1;i>=0;i--) 40 printf("%d",c[i]); 41 } 42 else 43 { 44 for(i=max1-1;i>=0;i--) 45 printf("%d",c[i]); 46 } 47 printf("\n"); 48 } 49 return 0; 50 }
2.减法
Input:123456789123456789
1
Output:123456789123456788
原理同加法一样(这里假设第一个数大于第二个数
View Code
1 减法模板 2 3 #include<stdio.h> 4 5 #include<string.h> 6 7 int main(void) 8 { 9 char s1[505],s2[505]; 10 while(scanf("%s%s",s1,s2)==2) 11 12 { 13 int i,j,len1,len2; 14 int a[105]={0},b[105]={0}; 15 len1=strlen(s1); 16 len2=strlen(s2); 17 for(i=len1-1,j=0;i>=0;i--,j++) 18 { 19 a[j]=s1[i]-48; 20 } 21 for(i=len2-1,j=0;i>=0;i--,j++) 22 { 23 b[j]=s2[i]-48; 24 } 25 for(i=0;i<len1;i++) 26 { 27 a[i]=a[i]-b[i]; 28 if(a[i]<0) 29 { 30 a[i]+=10; 31 a[i+1]--; 32 } 33 } 34 i=len1-1; 35 while(a[i]==0) 36 { 37 i--; 38 } 39 for(;i>=0;i--) 40 { 41 printf("%d",a[i]); 42 } 43 printf("\n"); 44 } 45 return 0; 46 }
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
View Code
1 乘法模板 2 3 #include<iostream> 4 #include<string.h> 5 using namespace std; 6 7 8 int main(void) 9 { 10 char s1[510],s2[510],temp[510]; 11 int a[510],b[510],c[1010]; 12 while(scanf("%s%s",s1,s2)==2) 13 { 14 int i,j,h; 15 int len1,len2; 16 if(strlen(s1)<strlen(s2)) 17 { 18 strcpy(temp,s1); 19 strcpy(s1,s2); 20 strcpy(s2,temp); 21 } 22 len1=strlen(s1); 23 len2=strlen(s2); 24 memset(c,0,sizeof(c)); 25 for(i=len1-1,j=0;i>=0;i--,j++) 26 { 27 a[j]=s1[i]-48; 28 } 29 for(i=len2-1,j=0;i>=0;i--,j++) 30 { 31 b[j]=s2[i]-48; 32 } 33 for(i=0;i<len2;i++) 34 { 35 for(j=0;j<len1;j++) 36 { 37 c[i+j]=a[j]*b[i]+c[i+j]; 38 } 39 } 40 for(i=0;i<2*len1;i++) 41 { 42 if(c[i]>=10) 43 { 44 c[i+1]=c[i+1]+c[i]/10; 45 c[i]=c[i]%10; 46 } 47 } 48 i=2*len1; 49 while(c[i]==0) 50 { 51 i--; 52 } 53 if(i<0) 54 { 55 printf("0\n"); 56 } 57 else 58 { 59 for(;i>=0;i--) 60 printf("%d",c[i]); 61 printf("\n"); 62 } 63 } 64 return 0; 65 }
4.除法
除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。
View Code
1 除法模板 2 3 #include<stdio.h> 4 #include<string.h> 5 6 int len1,len2; 7 char s1[905]; 8 char s2[905]; 9 int re[905]; 10 11 void sub() 12 { 13 int i=0; 14 int j; 15 while(1) 16 { 17 if(s1[i]=='0') 18 i++; 19 else 20 { 21 j=i; 22 break; 23 } 24 } 25 for(;i<len2;i++) 26 { 27 s1[i]=s1[i]-s2[i]+'0'; 28 } 29 for(i=len2-1;i>j;i--) //低位开始检测是否小于0 30 { 31 if(s1[i]<'0') 32 { 33 s1[i]+=10; 34 s1[i-1]--; 35 } 36 } 37 } 38 39 int main(void) 40 { 41 int i,p; 42 while(scanf("%s%s",s1,s2)==2) 43 { 44 len1=strlen(s1); 45 len2=strlen(s2); 46 if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0)) //如果a<b,直接输出0 47 { 48 printf("0\n"); 49 continue; 50 } 51 p=0; 52 while(1) 53 { 54 re[p]=0; 55 while(strncmp(s1,s2,len2)>=0) //一直进行减法,直到不能减为止 56 { 57 sub(); 58 re[p]++; 59 } 60 p++; 61 if(len1==len2) 62 break; 63 for(i=len2-1;i>=0;i--) //在s2前面补0,以便进行减法运算 64 { 65 s2[i+1]=s2[i]; 66 } 67 s2[0]='0'; 68 len2++; 69 s2[len2]='\0'; 70 } 71 i=0; 72 while(1) 73 { 74 if(re[i]==0) 75 i++; 76 else 77 break; 78 } 79 for(;i<p;i++) 80 printf("%d",re[i]); 81 printf("\n"); 82 } 83 return 0; 84 }