#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define Max 1000//大数的最大位数
int main()
{
char a[Max],b[Max];
int c[Max],d[Max],e[Max];
int i,j,len,flag;
char *temp_a=a,*temp_b=b,*temp;
while(cin>>a>>b)
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));//存放计算的结果,低位在前,高位在后,即e[0]是低位
int a1=strlen(a);//计算数组num1的长度,即大数的位数
int a2=strlen(b);//计算数组num2的长度,即大数的位数
//在进行减法之前要进行一些预处理
flag=0;//为0表示结果是正整数,为1表示结果是负整数
if(a1<a2)//如果被减数位数小于减数
{
flag=1;//标记结果为负数
//交换两个数,便于计算
temp=temp_a;
temp_a=temp_b;
temp_b=temp;
len=a1;
a1=a2;
a2=len;
}
else if(a1==a2)//如果被减数的位数等于减数的位数
{
//判断哪个数大
for(i=0; i<a1; i++)
{
if(a[i]==b[i])
continue;
if(a[i]>b[i])
{
flag=0;//标记结果为正数
break;
}
else
{
flag=1;//标记结果为负数
//交换两个数,便于计算
temp=temp_a;
temp_a=temp_b;
temp_b=temp;
break;
}
}
}
len=a1>a2?a1:a2;//获取较大的位数
//将num1字符数组的数字转换为整型数且逆向保存在整型数组sum中,即低位在前,高位在后
for(i=a1-1,j=0; i>=0; i--,j++)
c[j]=a[i]-48;
//转换第二个数
for(i=a2-1,j=0; i>=0; i--,j++)
d[j]=b[i]-48;
//将两个大数相减
for(i=0; i<=len; i++)
{
e[i]=c[i]-d[i];//两个数从低位开始相减
if(e[i]<0)//判断是否有借位
{
//借位
e[i]+=10;
e[i+1]--;
}
}
//计算结果长度
for(i=a1-1; i>=0&&e[i]==0; i--)
len=i+1;
if(flag==1)
{
e[len]=-1;//在高位添加一个-1表示负数
len++;
}
//输出结果
printf("%s - %s = ",a,b);
if(e[i=len-1]<0)//根据高位是否是-1判断是否是负数
{
printf("-");//输出负号
i--;
}
for(; i>=0; i--)
printf("%d",e[i]);
printf("\n");
return 0;
}
}
C语言实现大数相减(代码+注释+运行结果)
最新推荐文章于 2023-08-06 11:20:43 发布