大数加法 减法 乘法 除法 高精度四则运算
发布时间:2020-12-14 04:04:34 所属栏目:大数据 来源:网络整理
导读:1. 加法 输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。 #include stdio.h#include string.hint main(){ char m[555],n[555]; int i,len_m,len_n,len_max,k; int a[555]={0},b[555]={0},c[555]={0}; scanf("%s",m);
1. 加法 输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。 #include <stdio.h> #include <string.h> int main() { char m[555],n[555]; int i,len_m,len_n,len_max,k; int a[555]={0},b[555]={0},c[555]={0}; scanf("%s",m); len_m =strlen(m); for(i=0;i<=len_m -1;i++) a[i]=m[len_m -1 -i]-'0'; scanf("%s",n); len_n=strlen(n); for(i=0;i<=len_n -1;i++) b[i]=n[len_n -1 -i]-'0'; if(len_m>len_n) len_max=len_m; else len_max=len_n; k=0; for(i=0;i<=len_max -1;i++) { c[i]=(a[i]+b[i]+k)%10; k=(a[i]+b[i]+k)/10; } if(k!=0) c[len_max]=1; if(c[len_max]==1) printf("1"); for(i=len_max -1;i>=0;i--) printf("%d",c[i]); return 0; } 2. 减法 原理同加法一样(不确定两个数的大小关系) 比较两数大小:先比较长度,再按位比较(按位比较没写) #include <stdio.h> #include <string.h> int main() { char m[555],len_n; int a[555]={0},b[555]={0}; scanf("%s",n); len_n=strlen(n); for(i=0;i<=len_n -1;i++) b[i]=n[len_n -1 -i]-'0'; if(len_m < len_n) { printf("-"); for(i=0;i<len_n;i++) { b[i]-=a[i]; if(b[i]<0) { b[i]+=10; b[i+1]--; } } i=len_n-1; while(b[i]==0) i--; for(;i>=0;i--) printf("%d",b[i]); } else { for(i=0;i<len_m;i++) { a[i]-=b[i]; if(a[i]<0) { a[i]+=10; a[i+1]--; } } i=len_m-1; while(a[i]==0) i--; for(;i>=0;i--) printf("%d",a[i]); } return 0; } 3. 乘法 ?原理上也是采用数组模拟。 ?a[i]123 ?b[j]??12 ?用c[k]来保存每次的运算结果,k=i+j; ?c[i+j]=c[i+j]+a[i]*b[j]; ?这里来模拟一次乘法过程: ? ? ? ? ? ? ?123 ? ? ? ? * ? ? 12 ? ? ? ?------------- ? ? ? ? ? ? ? 246??? ????????+ ? ?123 ? ? ? ?------------- ? ? ? ? ? ? ?1476 #include <stdio.h> #include <string.h> int main() { char m[555],n[555],temp[555]; int i,j,c[1111]={0}; scanf("%s",m); scanf("%s",n); if(strlen(m)<strlen(n)) { strcpy(temp,m); strcpy(m,n); strcpy(n,temp); } len_m =strlen(m); for(i=0;i<=len_m -1;i++) a[i]=m[len_m -1 -i]-'0'; len_n=strlen(n); for(i=0;i<=len_n -1;i++) b[i]=n[len_n -1 -i]-'0'; for(i=0;i<len_n;i++) for(j=0;j<len_m;j++) c[i+j]+=a[j]*b[i]; for(i=0;i<2*len_m;i++) if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]%=10; } i=2*len_m; while(c[i]==0) i--; if(i<0) printf("0"); else { for(;i>=0;i--) printf("%d",c[i]); } return 0; } 4. 除法 除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。 #include <stdio.h> #include <string.h> int len1,len2; char s1[905],s2[905]; int re[905]; void sub() { int i=0,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() { int i,p; scanf("%s%s",s1,s2); len1=strlen(s1); len2=strlen(s2); if(len1<len2 || (len1==len2 && strncmp(s1,s2,len2)<0)) //如果a<b,直接输出0 printf("0n"); p=0; while(1) { re[p]=0; while(strncmp(s1,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]=' '; } i=0; while(1) { if(re[i]==0) i++; else break; } for(;i<p;i++) printf("%d",re[i]); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |