POJ2845_01000001

来源:互联网 发布:淘宝双11充值红包退款 编辑:程序博客网 时间:2024/06/06 09:06

考察点:

①写代码的基本素养;②类似于高精度的模拟。

思路:

此题一个case给出一系列的二进制数对,然后要求一对二进制数的和。我用的高精度模拟加法运算。

提交情况:

Wrong Answer 2次。一次忘了输出结果为0的情况,代码有缺陷,如果没有1就不会输出。

又一次,是在关于题输入输出结构和次数上犯错的了。题中提到就是一组循环,但是我用的

while(scanf("%d", &n) !=  EOF) {} 就挂掉了.

收获:

①再次熟悉了高精度加法的运用;

②明白了极限数据对判题的影响。不管是极大的溢出或是极小的输出0之类的要小心谨慎,

千万注意题中给出的数据范围和代码中间或输出时隐藏的数据范围问题。当然通常是溢出

和输出0的问题。

AC的代码;

#include <cstdio>
#include <cstring>


const int SIZE = 100;
char stra[SIZE], strb[SIZE];
int a[SIZE], b[SIZE], c[SIZE];


int main() {
int j, k, n;


scanf("%d", &n);
for (int i = 1; i <= n; i++) {
memset(c, 0, sizeof(c));
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s%s", stra, strb);
for (j = 0; j < (int)strlen(stra); j++) {
a[j] = stra[strlen(stra) - 1 - j] - '0';
}
for (j = 0; j < (int)strlen(strb); j++) {
b[j] = strb[strlen(strb) - 1 - j] - '0';
}
int max_length = (strlen(stra) >= strlen(strb) ? strlen(stra) : strlen(strb));
for (j = 0; j < max_length; j++) {
c[j] += a[j] + b[j];
if (c[j] > 1) {
c[j] -= 2;
c[j + 1]++;
}
}
printf("%d ", i);
for (j = max_length; j >= 0; j--) {
if (0 != c[j]) {
break;
}
}
if (-1 == j) {
j = 0;
}
for(k = j; k >= 0; k--) {
printf("%d", c[k]);
}
printf("\n");
}
return 0;
}

原创粉丝点击