#include
#include
#define MAX 20000
int a1[MAX+20];
int a2[MAX+20];
char b1[MAX+20];
char b2[MAX+20];
int aresult[MAX*2+20],flag=0;
int add(char *b1,char *b2)
{
int
i,j,flag=0;
memset(a1,0,sizeof(a1));
//将数组中所有内容置0
memset(a2,0,sizeof(a2));
int
len1=strlen(b1);
int
len2=strlen(b2);
j=0;
//把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(i=0;i进行运算
{
a1[i]+=a2[i];
if(a1[i]>=10)
//进位
{
a1[i]-=10;
a1[i+1]++;
}
}
for(i=MAX;i>=0;i--)
//跳过多余的0
{
if(a1[i]!=0)
flag=1;
//出现第一个非0,打开开关
if(flag)
printf("%d",a1[i]);
}
if(!flag)
//防止结果0被跳过后什么也不输出
printf("0");
return
0;
}
int minus(char *b1,char *b2)
{
int
i,j=0,flag=0,key=0;
memset(a1,0,sizeof(a1));
//将数组中所有内容置0
memset(a2,0,sizeof(a2));
int
len1=strlen(b1);
int
len2=strlen(b2);
if(len1判断大小
key=1;
if(len1==len2)
for(i=0;i
{
if(b1[i]
{
key=1;
break;
}
else
if(b1[j]==b2[j])
j++;
else
break;
}
if(!key) //若被减数大,正常进行
{
j=0;
//把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
}
if(key) //若被除数小,交换减数、被减数位置
{
j=0;
//把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a2[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a1[j++]=b2[i]-'0';
}
for(i=0;i进行运算
{
a1[i]-=a2[i];
if(a1[i]<0)
//借一位
{
a1[i]+=10;
a1[i+1]--;
}
}
if(key)
//如果被减数小,加负号
printf("-");
for(i=MAX;i>=0;i--)
//跳过多余的0
{
if(a1[i]!=0)
flag=1;
//出现第一个非0,打开开关
if(flag)
printf("%d",a1[i]);
}
if(!flag)
//防止结果0被跳过后什么也不输出
printf("0");
return
0;
}
int add1(char *b1,char *b2)
{
if(b1[0]=='-'
&& b2[0]!='-')
minus(b2,b1+1);
if(b1[0]!='-'
&& b2[0]=='-')
minus(b1,b2+1);
if(b1[0]=='-'
&& b2[0]=='-')
{
printf("-");
add(b1+1,b2+1);
}
if(b1[0]!='-'
&& b2[0]!='-')
add(b1,b2);
}
int minus1(char *b1,char *b2)
{
if(b1[0]=='-'
&& b2[0]!='-')
{
printf("-");
add(b1+1,b2);
}
if(b1[0]!='-'
&& b2[0]=='-')
add(b1,b2+1);
if(b1[0]=='-'
&& b2[0]=='-')
minus(b2+1,b1+1);
if(b1[0]!='-'
&& b2[0]!='-')
minus(b1,b2);
}
int mul(char *b1,char *b2)
{
int
i,j,flag=0;
memset(a1,0,sizeof(a1));
//将数组中所有内容置0
memset(a2,0,sizeof(a2));
memset(aresult,0,sizeof(aresult));
int
len1=strlen(b1);
int
len2=strlen(b2);
j=0;
//把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(j=0;j将第一个数的第j位乘以第二个数的第i位放到结果的第(i+j)位上
for(i=0;i
aresult[i+j]+=a1[j]*a2[i];
for(i=0;i处理进位
if(aresult[i]>9)
{
aresult[i+1]+=aresult[i]/10;
aresult[i]=aresult[i];
}
for(i=MAX;i>=0;i--)
//跳过多余的0
{
if(aresult[i]!=0)
flag=1;
//出现第一个非0,打开开关
if(flag)
printf("%d",aresult[i]);
}
if(!flag)
//防止结果0被跳过后什么也不输出
printf("0");
return
0;
}
int mul1(char *b1,char*b2)
{
if(b1[0]=='-'
&& b2[0]!='-')
{
printf("-");
mul(b1+1,b2);
}
if(b1[0]!='-'
&& b2[0]=='-')
{
printf("-");
mul(b1,b2+1);
}
if(b1[0]=='-'
&& b2[0]=='-')
mul(b1+1,b2+1);
if(b1[0]!='-'
&& b2[0]!='-')
mul(b1,b2);
}
int sub(int *p,int *q,int len1,int
len2)//p[0]、q[0]为个位
{
int
i;
if(len1先判断大小,若被除数小,直接返还-1
return
-1;
if(len1==len2)
for(i=len1-1;i>=0;i--)
//位数相同时,从最大位开始比较大小
{
if(p[i]
return -1;
else
if(p[i]>q[i])
break;
}
for(i=0;i减法运算,p-q后的数据放入p中
{
p[i]-=q[i];
if(p[i]<0)
{
p[i]+=10;
p[i+1]--;
}
}
for(i=len1;i>=0;i--)
{
if(p[i])
return
i+1;
//返回位数
}
return
0;
//若被除数等于除数,返回0
}
int div(char *b1,char *b2)
{
int
i,j,flag=0;
int
ntime;
int
leng1=strlen(b1);
int
leng2=strlen(b2);
ntime=leng1-leng2;
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(aresult,0,sizeof(aresult));
j=0;
for(i=leng1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=leng2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(i=leng1-1;i>=0;i--) //被除数乘以十的次方,使结果和被除数长度相同
{
if((i-ntime)>=0)
a2[i]=a2[i-ntime];
else
a2[i]=0;
}
leng2=leng1;
//结果与被除数长度相同
for(i=0;i<=ntime;i++) //从除数*10^(ntime)开始减减到不能减,再减去除数*10^(ntime-1)…………直至不能减去除数
{
while((j=sub(a1,a2+i,leng1,leng2-i))>=0)
//循环相减
{
++aresult[ntime-i];
//每减一次,商的对应位加一
leng1=j;
}
}
for(i=MAX;i>=0;i--)
//跳过多余的0
{
if(aresult[i]!=0)
flag=1;
//出现第一个非0,打开开关
if(flag)
printf("%d",aresult[i]);
//输出结果
}
if(!flag)
//防止结果0被跳过后什么也不输出
printf("0");
return
0;
}
int div1(char *b1,char *b2)
{
if(b1[0]=='-'
&& b2[0]!='-')
{
printf("-");
div(b1+1,b2);
}
if(b1[0]!='-' &&
b2[0]=='-')
{
printf("-");
div(b1,b2+1);
}
if(b1[0]=='-'
&& b2[0]=='-')
div(b1+1,b2+1);
if(b1[0]!='-'
&& b2[0]!='-')
div(b1,b2);
}
int mod(char *b1,char *b2)
{
int
i,j,flag=0;
int
ntime;
int
leng1=strlen(b1);
int
leng2=strlen(b2);
ntime=leng1-leng2;
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
j=0;
for(i=leng1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=leng2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(i=leng1-1;i>=0;i--) //被除数乘以十的次方,使结果和被除数长度相同
{
if((i-ntime)>=0)
a2[i]=a2[i-ntime];
else
a2[i]=0;
}
leng2=leng1;
//结果与被除数长度相同
for(i=0;i<=ntime;i++) //从除数*10^(ntime)开始减减到不能减,再减去除数*10^(ntime-1)…………直至不能减去除数
{
while((j=sub(a1,a2+i,leng1,leng2-i))>=0)
//循环相减,减到最后不能再减的a1就是余数
{
leng1=j;
}
}
for(i=MAX;i>=0;i--)
//跳过多余的0
{
if(a1[i]!=0)
flag=1;
//出现第一个非0,打开开关
if(flag)
printf("%d",a1[i]);
//输出余数
}
if(!flag)
//防止结果0被跳过后什么也不输出
printf("0");
return
0;
}
int mod1(char *b1,char *b2)
{
if(b1[0]=='-'
&& b2[0]!='-')
{
printf("-");
mod(b1+1,b2);
}
if(b1[0]!='-'
&& b2[0]=='-')
mod(b1,b2+1);
if(b1[0]=='-'
&& b2[0]=='-')
{
printf("-");
mod(b1+1,b2+1);
}
if(b1[0]!='-'
&& b2[0]!='-')
mod(b1,b2);
}
int main()
{
scanf("%s",b1);
scanf("%s",b2);
printf("加:");
add1(b1,b2);
printf("\n减:");
minus1(b1,b2);
printf("\n乘:");
mul1(b1,b2);
printf("\n除:");
div1(b1,b2);
printf("\n取模:");
mod1(b1,b2);
}
----徐瑞