HDUOJ入坑的第一天--------1002题(计算A+B)
今天去HDUOJ逛了一下,尝试了一下以前竞赛的练习题,结果第一道题就被坑了,说出来你可能不信,A+B我居然不会。。。。。。看下题目吧:
题目意思大致说一下,就是求给定n组数对,求每对数的和,嗯,看起来简单吧,我也觉得,可是事实是这样的。。。。。。。。:
我当时很懵,我小学学的还是挺好的,怎么加法都不会了。。。。。。。
然后
又看了一遍题目,突然想到这里它说得的加法它的数字位数有猫腻,(去他的Integer,就知道误导学生入坑),10000位的整数。。。。。int小身子板它表示不出来,所以,机智的我改用了char类型数组,下面是我的代码,(已ac)
#include <stdio.h>
#include <string.h>
int main() {
/*
* n代表要计算几次
* num1len 表示第一个数的长度位数, num2len 表示第二个数的长度位数, sumlen;
*/
int n, temp, num1len, num2len, sumlen;
/*存放结果的*/
int sum[10000];
/*输入参数*/
scanf("%d", &n);
for (int i =1; i <= n; i++)
{
char num1[10000], num2[10000], temp1[10000], temp2[10000];
temp = 0;
scanf("%s %s", temp1, temp2);
/*拷贝一份两个加数,用于后面的加法转换 */
for (int l1 = 0; l1 <= strlen(temp1); l1++)
{
num1[l1] = temp1[l1];
}
for (int l2 = 0; l2 <= strlen(temp2); l2++)
{
num2[l2] = temp2[l2];
}
num1len = strlen(num1);
num2len = strlen(num2);
/*求出和的最小位数*/
sumlen = (num1len > num2len ? num1len : num2len);
/*将备份数组反过来,逐位对齐,
*1234
*123456
*操作后
*432100
*654321
*/
if (num1len > num2len)
{
for (int r = sumlen - 1, s = num2len - 1; r >= 0; r--, s--)
{
if (r >= sumlen - num2len)
{
num2[r] = num2[s];
} else
{
num2[r] = '0';
}
}
} else
{
for (int r = sumlen - 1, s = num1len - 1; r >= 0; r--, s--)
{
if (r >= sumlen - num1len)
{
num1[r] = num1[s];
} else
{
num1[r] = '0';
}
}
}
/*逐位相加,满十近一*/
for (int z = sumlen - 1; z >= 0; z--)
{
sum[z] = (num1[z] + num2[z] + temp - 2 * '0') % 10;
temp = (num1[z] + num2[z] - 2 * '0' + temp) / 10;
}
/*打印结果*/
printf("Case %d:\n", i);
printf("%s + %s = ", temp1, temp2);
if (temp)
{
printf("%d", temp);
}
for (int w = 0; w < sumlen; w++)
{
printf("%d",sum[w]);
}
printf("\n");
if (i != n)
{
printf("\n");
}
}
return 0;
}
写的有点乱,但思路是这样,需要注意的是,这里不能用int
结果(ac了,开心,哈哈哈,我还不傻):