大数减法
描述:
有两个数,计算它们的差值。
输入
有多组输入数据,对于每组测试数据,输入两个数a,b,直到文件结束。
输出
对于每组测试数据,输出a-b的值。
输入样例
5687921356358125 26535472913516826
25648295652 25643581649
输出样例
-20847551557158701
4714003
大数减法的思路与加法思路差不多,但要考虑到借位的情况,始终要保证大的数减去小的数,如果前一个数小于后面的,,仍然是大数减小数,但最后要按题目要求先输出一个负号。代码思路很明确,看代码吧。
代码:
#include<stdio.h>
#include<string.h>
int compare(char *str_a,char *str_b)
{
int len_a, len_b;
len_a = strlen(str_a); //分别获取大数的位数进行比较
len_b = strlen(str_b);
if ( strcmp(str_a, str_b) == 0 ) //如果被减数与减数完全一样返回比较结果
return 0;
if ( len_a > len_b )
return 1;
else if( len_a == len_b )
return strcmp(str_a, str_b); //可正可负,正表示a > b,否则b > a
else
return -1;
}
int main()
{
char str_a[1000], str_b[1000];
int num_a[1000],num_b[1000];
int num_c[1000];
int f, n,i,j, k;
while (scanf("%s%s",str_a,str_b)!= EOF) //可进行多组测试
{
int len_a = strlen(str_a); //分别获得两个大数的位数
int len_b = strlen(str_b);
k = len_a > len_b? len_a:len_b; //获得最大的位数
num_c[0] = 0;
f = 0;
n = compare(str_a,str_b);
memset(num_a,0,sizeof(num_a)); memset(num_b,0,sizeof(num_b)); //清零操作
for (i=len_a - 1,j = 0;i >= 0;i--) //颠倒存储
num_a[j++] = str_a[i] - '0';
for (i=len_b - 1,j = 0;i>=0;i--)
num_b[j++] = str_b[i] - '0';
for (i=0;i<k;i++) //逐位进行减法
{
if (n>=0) //a>b,进行a-b
{
if (num_a[i] >= num_b[i])
num_c[i] = num_a[i] - num_b[i];
else
{
num_c[i] = num_a[i] - num_b[i] + 10; //借位
num_a[i+1]--;
}
}
else //a<b,进行b-a
{
if ( num_b[i] >= num_a[i])
num_c[i] = num_b[i] - num_a[i];
else
{
num_c[i] = num_b[i] - num_a[i] + 10; //借位
num_b[i+1]--;
}
}
}
if (n<0) //a<b的情况按要求打印
printf("-");
for (i=k-1; i>=0; i--)
{
if (num_c[i])
f = 1;
if (f)
printf("%d",num_c[i]);
}
printf("\n");
}
return 0;
}