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 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 int main() {int a[10000], b[10000];  // 使用数组存储A和Bint 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+Bint 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;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部