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;
}