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';??
- ????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. 减法
原理同加法一样(不确定两个数的大小关系)
比较两数大小:先比较长度,再按位比较(按位比较没写)
copy
- 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--;???
- 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
????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';??
- 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??????
- 4. 除法
除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。
copy
int?len1,len2;??
- char?s1[905],s2[905];??
- int?re[905];??
- void?sub()??
- int?i=0,j;??
- while(1)??
- if(s1[i]=='0')??i++;??
- ????????????j=i;??
- break;??
- for(;i<len2;i++)??
- ????????s1[i]=s1[i]-s2[i]+'0';??
- for(i=len2-1;i>j;i--)??????????????
- if(s1[i]<'0')??
- ????????????s1[i]+=10;??
- ????????????s1[i-1]--;??
- }??
- ????scanf("%s%s",s1,s2);???
- ????len1=strlen(s1);??
- ????len2=strlen(s2);??
- if(len1<len2?||?(len1==len2?&&?strncmp(s1,s2,len2)<0))?????
- ????????printf("0n");???
- ????p=0;??
- ????????re[p]=0;??
- while(strncmp(s1,len2)>=0)????????
- ????????????sub();??
- ????????????re[p]++;??
- ????????p++;??
- if(len1==len2)??break;??
- for(i=len2-1;i>=0;i--)???????????????
- ????????????s2[i+1]=s2[i];???
- ????????s2[0]='0';??
- ????????len2++;??
- ????????s2[len2]=' ';??
- ????i=0;??
- while(1)??
- if(re[i]==0)????i++;??
- else????????????for(;i<p;i++)??
- }???
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|