2096 小明A+B - HDOJ

2096 小明A+B

Problem Description

小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算.
对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于100, 那么小明也仅保留计算结果的最后两位.

例如, 对于小明来说:
1) 1234和34是相等的
2) 35+80=15

给定非负整数A和B, 你的任务是代表小明计算出A+B的值.

Input

输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据. 每组测试数据包含两个非负整数A和B(A和B均在int型可表示的范围内).

Output

对于每组测试数据, 输出小明A+B的结果.

Sample Input

2
35 80
15 1152

Sample Output

15
67

Solution:

首先想到的思路是, 将a+b之后的值, 用求余的方法得到最后两位, 并且计算出值.

#include <cstdio>

int main() {
int T; scanf("%d", &T);
while (T--) {
int a, b; scanf("%d %d", &a, &b);
int sum, ans = 0;
sum = a + b;
if (sum >= 100) {
ans += sum % 10;
ans += (sum/10%10) * 10;
} else {
ans = sum;
}
printf("%02d\n", ans); // 改了也没ac
}
return 0;
}

// WA

题目中说最后a, b都在int范围内, 但a+b没说, 刚开始觉得应该不会考这个吧, 但现在没其他选择.
修改思路, 只相加最后两位, 需要自己实现整数相加的过程, 有点像大整数.

坑点:

  • 一个是上述说的整数溢出.
  • 如果是个位数的话, 前面不需要加0

代码:

// 推测溢出, 只加后两位
#include <cstdio>
#include <cstring>

int arr_a[1005], arr_b[1005], len_a, len_b;

int K = 2;

int main() {
int T; scanf("%d", &T);
while (T--) {
int a, b; scanf("%d %d", &a, &b);
memset(arr_a, 0, sizeof(arr_a));
memset(arr_b, 0, sizeof(arr_b));
len_a = 0, len_b = 0;

while (a && len_a < K) {
arr_a[len_a++] = a % 10;
a /= 10;
}

while (b && len_b < K) {
arr_b[len_b++] = b % 10;
b /= 10;
}

int ans = 0, carry = 0, temp = 0, s = 1;
for (int i = 0; i < K; i++) {
temp = arr_a[i] + arr_b[i] + carry;
ans += (temp % 10) * s;
s *= 10;
carry = temp/10;
}
printf("%d\n", ans);
}
return 0;
}