大数的四则运算
在處理大數的運算時,一般采用數組去模擬,下面介紹大數的加、減、乘、除四則運算的實現方法。
1.加法。
? 如:
? Input: 123456789123456789123456789
??????????? 1
? Output:123456789123456789123456790
? 輸入采用字符數組保存,然后將輸入存在整形數組里,然后逐位相加即可,同時注意進位處理。
#include<stdio.h> #include<string.h> int max(int x,int y) {if(x>y)return x;elsereturn 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++;elsebreak;}for(;i<p;i++)printf("%d",re[i]);printf("\n");}return0; }總結
- 上一篇: 整数划分问题(续)(非递归法)
- 下一篇: 求n!中含有某个因子个数的方法