思路导图
完整代码
#include<bits/stdc++.h>
void add(int* count_1,int *count_2,int *ans,int max)
{
for(int now=0;now<max;now++)
{
ans[now]+=count_1[now]+count_2[now];//这一位的值加上第一个数组的该位值 再加上第二个数组的该位值
if(ans[now]>=10)//大于10就进位
{
ans[now+1]+=1;//进一位
ans[now]%=10;//留下个位
}
}
}
void sub(int* count_1,int *count_2,int *ans,int max)
{
for(int now=0;now<max;now++)
{
ans[now]+=count_1[now]-count_2[now];//这一位的值等于第一个数组的该位值 减去第二个数组的该位值
if(ans[now]<0)//如果该位数字小于0
{
ans[now]+=10;//借一位 加10
ans[now+1]--;//前一位-1;
}
}
}
void print(int *ans,int max)
{
bool kg=false;
for(int now=max-1;now>=0;now--)
{
if(ans[now]!=0||kg==true)
{
printf("%d",ans[now]);
kg=true;
}
}
}
int main()
{
char string0[1000],*front,*after,sign;//输入的字符串 切割后的第一个字符串front 第二个字符串after 符号
scanf("%s",string0);
for(int now=0;;now++)
{
if(string0[now]=='+')//找到加号
{
sign='+';
front=strtok_r(string0,"+",&after);//切割
break;
}
else if(string0[now]=='-')//找到减号
{
sign='-';
front=strtok_r(string0,"-",&after);//切割
break;
}
}
int n=strlen(front),m=strlen(after);//两个数的位数 用于下一行的最大位数的选择
int max;//最大位数 不超过两个数最大位数+1
if(n>m)//n比m大
{
max=n+1;
}
else
{
max=m+1;
}
int count_1[max], count_2[max], ans[max];//第一个数的数组 第二个数的数组 答案
memset(count_1,0,sizeof(count_1));
memset(count_2,0,sizeof(count_2));
memset(ans,0,sizeof(ans));//每一位都初始化为0
for(int now=0;now<n;now++)
{
count_1[now]=front[n-now-1]-'0';
}
for(int now=0;now<m;now++)
{
count_2[now]=after[m-now-1]-'0';
}
printf(" = ");
if(sign=='+')
{
add(count_1,count_2,ans,max);
}
else
{
if(n>m)// 1 比 2 长
{
sub(count_1,count_2,ans,max);
}
else if(n==m)//一样长
{
bool state=false;
for(int a=max-1;a>=0&&state==false;a--)
{
if(count_1[a]>count_2[a])
{
sub(count_1,count_2,ans,max);
state=true;
}
else if(count_1[a]<count_2[a])
{
printf("-");
sub(count_2,count_1,ans,max);
state=true;
}
}
if(state==false)
{
printf("0");
}
}
else//1 比 2 短
{
printf("-");
sub(count_2,count_1,ans,max);
}
}
print(ans,max);
return 0;
}