1101: 3201 A+B问题

题目描述

读入两个小于10000的正整数A和B,计算A+B。需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。

输入

测试输入包含若干测试数据,每个测试数据占一行,格式为A B K,相邻两数字有一个空格间隔。当A和B同时为0时输入结束,相应的结果不要输出。

输出

对每个测试数据输出1行,即A+B的值或者是-1。

样例输入 复制

1 2 1
11 21 1
108 8 2
36 64 3
0 0 1

样例输出 复制

3
-1
-1
100

这个题  没想到的点在于 要比对最后k位是否一样,其实可以用取余的办法,!

可能是之前没有经常用这个办法,不是很熟练。

再就是 还是要注意 如果下一步要用到某个值,最好不要在某个值上进行变化。可以定义一个新的值去看变化的情况。

#include <stdio.h>

int main() {
    int a, b, k;
    while (scanf("%d %d %d", &a, &b, &k) !=EOF ) {
        if (a == 0 && b == 0) {
            break;
        }

        // 计算A和B的末尾K位数字,并判断它们是否相同
        int a_last_k_digits[k];
        int b_last_k_digits[k];
        int x=a;
        int y=b;
        for (int i = 0; i < k; i++) {
            a_last_k_digits[i] = x % 10;
            b_last_k_digits[i] = y % 10;
            x/=10;
            y/=10;
        }
        int is_same = 1;
        for (int i = 0; i < k; i++) {
            if (a_last_k_digits[i] != b_last_k_digits[i]) {
                is_same = 0;
                break;
            }
        }

        if (is_same) {
            printf("-1\n");
        } else {
            printf("%d\n", a + b);
        }
    }
    return 0;
}

如果想用数组的话,是很麻烦。

毕竟这不是高精度,没有用数组的必要, 麻烦的点在于最后的加法上

#include <stdio.h>

int main() {
    int a[10000], b[10000];  // 使用数组存储A和B
    int k;
    while (scanf("%d %d %d", &a[0], &b[0], &k) == 3) {
        if (a[0] == 0 && b[0] == 0) {
            break;
        }

        // 计算A和B的末尾K位数字,并判断它们是否相同
        int len_a = 0, len_b = 0;
        while (a[len_a]) { len_a++; }
        while (b[len_b]) { len_b++; }
        int i = 1, j = 1, is_same = 1;
        for (; i <= k && len_a - i >= 0 && len_b - i >= 0; i++, j++) {
            if (a[len_a - i] != b[len_b - i]) {
                is_same = 0;
                break;
            }
        }
        if (i <= k && len_a >= k && len_b >= k) {
            is_same = 0;
        }

        if (is_same) {
            printf("-1\n");
        } else {
            int sum[10001] = {0};  // 使用数组存储A+B
            int carry = 0, len_sum = 0;
            for (i = len_a - 1, j = len_b - 1; i >= 0 || j >= 0; i--, j--) {
                int x = (i >= 0) ? a[i] : 0;
                int y = (j >= 0) ? b[j] : 0;
                int tmp = x + y + carry;
                sum[len_sum++] = tmp % 10;
                carry = tmp / 10;
            }
            if (carry > 0) {
                sum[len_sum++] = carry;
            }

            // 输出A+B的值
            for (i = len_sum - 1; i >= 0; i--) {
                printf("%d", sum[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值