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],n[555];
- int i,len_m,len_n;
- int a[555]={0},b[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)
- {
- 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,len_m,len_n;
- int a[555]={0},b[555]={0},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("0\n");
- 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]);
- return 0;
- }
http://blog.csdn.net/u011328276/article/details/9464817