##大数相减
#include<stdio.h>
#include<string.h>
#define MAX 1000
int subtraction(char num1[],char num2[],int sum[])
{
int len1= strlen(num1); //获取长度
int len2= strlen(num2);
int i,j,len,flag=0;
int n2[MAX]={0};
char *temp; //定义指针,用于交换数组
//为了方便计算,把总保持数组一为较大的数组
if(len1<len2) //如果数组1的位数小于数组2
{
temp=num1; //交换两数组
num1=num2;
num2=temp;
len=len1; //交换两数组长度
len1=len2;
len2=len;
flag=1;
}
else if(len1==len2) //如果两数组位数相等
{
for(i=0;i<len1;i++) //逐个比较各位数大小
{
if(num1[i]==num2[i])
continue; //相等则比较下一位
else if(num1[i]<num2[i]) //如果数组一小于数组二,交换两数组位置
{
temp=num1;
num1=num2;
num2=temp;
flag=1; //并标记为负数
break;
}
}
}
for(i=0,j=len1-1;i<len1;i++,j--) //与大数相加一样,倒序操作
{
sum[i]=num1[j]-'0';
}
for (i=0,j=len2-1;i<len2;i++,j--)
{
n2[i]=num2[j]-'0';
}
len=len1>len2?len1:len2;
for(i=0;i<len;i++) //相减
{
sum[i]=sum[i]-n2[i];
if(sum[i]<0)
{
sum[i]+=10; //这两行是借位操作
sum[i+1]--;
}
}
for (i = len1-1; i>=0 && sum[i] == 0; i--);
len = i+1;
if(flag==1)
{
sum[len] = -1; // 在高位添加一个-1表示负数
len++;
}
return len; // 返回结果的位数
}
int main()
{
int len,i,flag;
int sum[MAX]={0};
char a1[]="11111111111111";
char a2[]="99999999999999";
len=subtraction(a1,a2,sum);
printf("num1 %s - num2 %s=\n",a1,a2);
if(sum[i=len-1]<0) //判断是否为负数
{
printf("-");
i--;
}
else if(sum[0]==NULL) //如果为0,单独输出,并结束主函数
{
printf("0");
return 0;
}
for(;i>=0;i--) //倒序输出
{
printf("%d",sum[i]);
}
return 0;
}