一、题目描述
这是 杭州电子科技大学acm网站(acm.hdu.edu.cn)的1002题。
输入两个字符串代表两个长整数,计算他们的和并输出。
二、解题思路
这道题思路:
用三个字符串分别存a、b和二者之和
读入a、b,倒置,从a[0]、b[0]开始相加,注意进位。
坑点在于,每个Case的最后一行的最后是有意一个回车符号的。
所以这道题在这个格式上设立的陷阱令人“不快”。
三、参考代码
#include<stdio.h>
#include<iostream>
using namespace std;
char s1[1002], s2[1002], s3[1002];
void add()
{
char *p, *q, *s;
p = s1; q = s2; s = s3;
int jw = 0;//进位
while (*p != '\0' && *q != '\0')
{
int t;
t = *p - '0' + *q - '0' + jw;//对应位相加
jw = t / 10;//是否有进位
t = t % 10;
*s = t + '0';
p++; q++; s++;
}
//cout << s3 << endl;
while (*p != '\0')
{//s1还有剩余
int t;
t = *p - '0' + jw;
jw = t / 10;
t = t % 10;
*s = t + '0';
p++; s++;
}
while (*q != '\0')
{//s2还有剩余
int t;
t = *q - '0' + jw;
jw = t / 10;
t = t % 10;
*s = t + '0';
q++; s++;
}
*s = '\0';
}
void reverse(char *s)
{//字符串倒置
int n;
n = strlen(s);
char *p, *q;
p = s; q = s + n - 1;
while (p < q)
{
char t;
t = *p; *p = *q; *q = t;
p++; q--;
}
}
int main()
{
int n, i;
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> s1 >> s2;
if (i > 1)
cout << "\n";
cout << "Case " << i << ":\n";
cout << s1 << " + " << s2 << " = ";
reverse(s1);
reverse(s2);
add();
reverse(s3);
cout << s3 << endl;//行尾有换行符号
}
return 0;
}
评说:我是建议程序竞赛类题目,还是去掉presentation error这个考察点,学生在这方面花的时间太多了,影响了以算法为中心的初衷。