计蒜客 T1099: 大整数减法

博客介绍了如何解决计蒜客T1099问题,即实现大整数的减法运算。通过从下标0开始,将末尾的换行符替换为0,对齐并处理退位,最后检查结果是否为0以及去除前导0,实现大整数的减法规则。思路与大整数加法类似,但进行了相应调整。
摘要由CSDN通过智能技术生成

计蒜客 T1099: 大整数减法

问题
求两个大的正整数相减的差。
输入格式
共 2 行,第 1 行是被减数 a,第 2 行是减数 b(a>b)。每个大整数不超过 200 位,不会有多余的前导零。
输出格式
一行,即所求的差。
格式说明
输出时每行末尾的多余空格,不影响答案正确性
思路

  • 鉴于之前的大整数加法,当时采用的是从下标1开始,而且有末尾\n的影响,计算时要考虑的太多,因而在减法这里,做了些许调整,改为:从下标0开始,并且将末尾的\n修改为0。
  • 主要思路:包括赋值及统计长度、修改\n为0、对齐处理、退位处理
    • 赋值、统计长度:采用getchar()函数进行获取并赋给数组,规定遇\n退出,此时\n赋给了数组,但长度没有累计。同时,在长度到达201时跳出,题目规定是不超过200。
    • 修改\n为0:将\n所在位置置0。
    • 对齐处理:比较两个数组的长度,长度小者将数组进行移位,同时将原来的位置置0。
    • 退位处理:将在长度内的数组元素相减,若相减结果是负数,那就令前一数组元素减1。
    • 判断相减的数是否都为0:如果是0+0,则程序提前终止。用zero_if来统计所有的数组元素之和是否为0,如果都为0,说明是0+0。
    • 去除前导0:设置flag标志位,如果flag已经被赋予1,说明前导0已循环完毕,没有打印输出,可以安全打印出剩余的数组元素。
      这个减法的思路实际上和大整数加法的思路是一样的,有些许不同,关于大整数加法的思路大家可以看看之前的文章:计蒜客 T1098:大整数加法
#include<stdio.h>
#define N 200

int main(){
   

    int length_a=0,length_b=0,flag=0,zero_if=0;//从0开始,前面不再有序号为0的防止进位的0
    char a[N]={
   0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较常见的问题,我来为您解答。 首先,我们需要明确一个问题,那就是大整数的加减法是如何进行的。我们知道,大整数减法与小整数减法的本质是一样的,只是操作的数变成了大整数。因此,我们可以把大整数减法转化为小整数减法进行算。 具体来说,我们可以将大整数按照每9位一组进行拆分,每组最高位可以是1位或者2位,这样每一组就可以转化为一个小整数。然后,我们就可以使用小整数减法的方法进行算。最后,将每一组的算结果拼接起来,就得到了最终的结果。 下面是一个使用整型数组表示大整数的加减法的示例代码: ```python #include <iostream> #include <cstring> using namespace std; const int N = 100010; int a[N], b[N], c[N]; // 数组a表示被加数或被减数,数组b表示加数或减数,数组c表示结果 char str1[N], str2[N]; // 输入的两个字符串 int len1, len2; // 两个字符串的长度 void add(int a[], int b[], int c[]) // 大整数加法 { int t = 0; for (int i = 0; i < N; i++) { c[i] = a[i] + b[i] + t; t = c[i] / 10; c[i] %= 10; } } void sub(int a[], int b[], int c[]) // 大整数减法 { int t = 0; for (int i = 0; i < N; i++) { c[i] = a[i] - b[i] - t; if (c[i] < 0) { c[i] += 10; t = 1; } else t = 0; } } void print(int c[]) // 输出结果 { int k = N - 1; while (k > 0 && c[k] == 0) k--; for (int i = k; i >= 0; i--) cout << c[i]; cout << endl; } int main() { cin >> str1 >> str2; len1 = strlen(str1); len2 = strlen(str2); // 将输入的字符串转化为整型数组 for (int i = 0; i < len1; i++) a[i] = str1[len1 - i - 1] - '0'; for (int i = 0; i < len2; i++) b[i] = str2[len2 - i - 1] - '0'; // 大整数加法 add(a, b, c); print(c); // 大整数减法 sub(a, b, c); print(c); return 0; } ``` 需要注意的是,上面的代码只是一个示例,实际上还需要进行很多的优化,例如处理负数、处理进位等问题。另外,如果要进行乘法和除法的运算,就需要使用更加复杂的算法,例如Karatsuba算法和FFT算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值