萌新的整数大数加减
大致思路:
-
数据输入 将数据存入字符数组 运算符号存入字符。
-
整数正负判断 使用strlen()函数将两组字符串长度存入整形变量len,之后判断数据是否为负,是则长度减一并且使用一整型变量存储正负数据。
-
数据类型转换 倒叙将字符数组转为整型数组。
-
判断运算类型
-
输出符号判断
-
数据运算 加法运算直接模拟竖式计算;减法运算使被减数在两组数据最高位后一位补一,再相减(如456-789转换为1456-789=0667),如果最高位后一位为1直接输出,否则(即为0)使最高位为1其余为0减去结果(1000-0667=333)。
-
输出运算结果 找到第一个不为0的数开始输出,全0则输出0。
分割线
2018.10.30 代码有点bug,应该是第43行没处理好,懒得改了
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char str1[1010],str2[1010];
int v1[1010],v2[1010],range=1000+1; //range为计算位数+1
void add(int len) //加法运算
{
int i;
for(i=range-1;i>=len;i--) //倒叙相加逢十进一
{
v1[i]+=v2[i];
if(v1[i]>9)
{
v1[i]-=10;
v1[i-1]++;
}
}
if(v1[len-1]!=0)printf("%d",v1[len-1]); //判断最高位下一位是否为0
for(i=len;i<range;i++)
printf("%d",v1[i]); //输出
printf("\n");
}
void sub(int len,int flag1) //减法运算
{
int i,sign=1; //sign >0为正 =0为0 <0为负
if(v1[len]==v2[len]) //判断数据结果是否为负或0
{
for(i=len+1;i<range;i++)
{
if(v1[i]!=v2[i])
sign=(v1[i]-v2[i])*flag1;
}
if(i==range)sign=0;
}
else sign=(v1[len]-v2[len])*flag1;
if(sign<0)printf("-");
if(sign==0)printf("0");
v1[len-1]=1; //最高位前一位补1
for(i=range-1;i>=len;i--) //相减结果存入v1
{
v1[i]-=v2[i];
if(v1[i]<0)
{
v1[i]+=10;
v1[i-1]--;
}
}
if(v1[len-1]==1) //最高位前一位未被借位
{
for(i=len;i<range;i++)
if(v1[i]!=0)break;
for(;i<range;i++) //输出
printf("%d",v1[i]);
}
else //具体见思路6
{ //结果存入v2
memset(v2,0,sizeof(v2));
v2[len-1]=1;
for(i=range-1;i>=len;i--)
{
v2[i]-=v1[i];
if(v2[i]<0)
{
v2[i]+=10;
v2[i-1]--;
}
}
for(i=len;i<range;i++)
if(v2[i]!=0)break;
for(;i<range;i++) //输出
printf("%d",v2[i]);
}
printf("\n");
}
int main()
{
int i,j;
char sign;
while(~scanf("%s %c %s",&str1,&sign,&str2))
{
int len1=strlen(str1),len2=strlen(str2),flag1=1,flag2=1,j1=0,j2=0;
if(str1[0]=='-') //flag存数据正负 len存长度 j存从第几位开始转换
{
j1++;
len1--;
flag1=-1;
}
if(str2[0]=='-')
{
j2++;
len2--;
flag2=-1;
}
for(i=range-len1,j=j1;i<range;i++)
v1[i]=str1[j++]-'0';
for(i=range-len2,j=j2;i<range;i++)
v2[i]=str2[j++]-'0';
if(sign=='+')
{
if(flag1*flag2==-1)
{
sub(min(range-len1,range-len2),flag1); //正+负 负+正
}
else
{
if(flag1==-1)
{
printf("-");
add(min(range-len1,range-len2)); //负+负
}
else
add(min(range-len1,range-len2)); //正+正
}
}
if(sign=='-')
{
if(flag1*flag2==1)
{
sub(min(range-len1,range-len2),flag1); //正-正 负-负
}
if(flag1*flag2==-1)
{
if(flag1==1)add(min(range-len1,range-len2)); //正-负
else {printf("-");add(min(range-len1,range-len2));} //负-正
}
}
memset(v2,0,sizeof(v2)); //清零
memset(v1,0,sizeof(v1));
printf("\n");
}
return 0;
}