大数相减c语言,C语言实现大整数减法

在北京航空航天大学出版社出版的丁海军老师主编的《程序设计基础(C语言)》第236页,我看到了一个大整数减法的的算法实现,试验了这样一组数据:

as="99999";bs="100004";

结果:

rs=-1&1&5

请按任意键继续. . .

多次调试,我发现了一个问题:

当需要向高位借一时,如果高位为零,那么高位做减一操作,高位存储的ASCII值就变成了255,这样,接下来的运算就向着我不能预知的方向发展了。于是,我在修改了处理错位时的代码:else  //a

{

for(i=0;i

if(b[i]

{

if(b[i+1]==0)

{

p=0;

while(b[++p+i]==0);

b[i+p]--;

while(--p)

b[i+p]=9;

}

else

b[i+1]--;

b[i]+=10;

r[i]=b[i]-a[i];

}

else

r[i]=b[i]-a[i];

}

这样程序终于可以正确运行了:

结果:

rs=-5

请按任意键继续. . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
整数减法的思路和小学数学中的减法一样,从个位开始逐位,如果被数小于数,则向高位借位。具体实现过程如下: 1. 将两个大整数转换成同长度,可以在较短的整数前面补0,使得两个整数的位数同。 2. 从末位开始逐位,如果被数小于数,则向高位借位,借位后被数加上10。 3. 将后的结果存入结果数组中。 4. 最后,将结果数组中的数反向输出,即为减法的结果。 以下是 C 语言实现整数减法运算的示例代码: ```c #include <stdio.h> #include <string.h> #define N 1000 void reverse(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } } int main() { char a[N], b[N], res[N]; int lena, lenb, len; int i, j, k, borrow; printf("请输入被数:"); scanf("%s", a); printf("请输入数:"); scanf("%s", b); lena = strlen(a); lenb = strlen(b); // 将较短的整数前面补0,使得两个整数的位数同 if (lena < lenb) { for (i = lena - 1; i >= 0; i--) { a[i + lenb - lena] = a[i]; } for (i = 0; i < lenb - lena; i++) { a[i] = '0'; } len = lenb; } else { for (i = lenb - 1; i >= 0; i--) { b[i + lena - lenb] = b[i]; } for (i = 0; i < lena - lenb; i++) { b[i] = '0'; } len = lena; } // 从末位开始逐位 borrow = 0; for (i = len - 1; i >= 0; i--) { k = a[i] - b[i] - borrow; if (k < 0) { k += 10; borrow = 1; } else { borrow = 0; } res[i] = k + '0'; } // 去掉结果前面的0,并将结果反向输出 i = 0; while (res[i] == '0' && i < len - 1) { i++; } for (j = i; j < len; j++) { printf("%c", res[j]); } printf("\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值