题目描述
读入两个小于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;
}