-2

我试图在 UVa 中解决这个问题,但我得到了错误的答案,我似乎找不到错误
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2525

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int t,j,k,i=1;
char a[1000];

while(scanf("%d",&t)!=EOF && t)
{
int sum=0; 
getchar();

gets(a);

k=strlen(a);

for(j=0;j<k;j++)
           {     if(a[j]=='a'||a[j]=='d'||a[j]=='g'||a[j]=='j'||a[j]=='m'||a[j]=='p'||a[j]=='t'||a[j]=='w'||a[j]==32)
                sum=sum+1;
                else if(a[j]=='b'||a[j]=='e'||a[j]=='h'||a[j]=='k'||a[j]=='n'||a[j]=='q'||a[j]=='u'||a[j]=='x')
                sum=sum+2;
                else if(a[j]=='c'||a[j]=='f'||a[j]=='i'||a[j]=='l'||a[j]=='o'||a[j]=='r'||a[j]=='v'||a[j]=='y')
                sum=sum+3;
                else if(a[j]=='s'||a[j]=='z')
                sum=sum+4;
            }

printf("Case #%d: %d\n",i,sum);
i++;
}
return 0;
}
4

2 回答 2

2

在问题描述中,有一个数字表示之后输入中的文本数量。您的原始代码试图在每行输入之前读取数字。

由于输入字符集不包含任何数字,因此读取每一行中的数字的尝试将失败,因此您可能倾向于认为应该没有区别。但是,当您尝试读取一个数字时,它会从消耗前导空格开始。如果输入是:

<空格><空格>一个

输出应该是 3(两个 '0' 和一个 '2' 键),但尝试从行中读取数字将消耗两个前导空白字符,而后者gets将读取字符串"a",而不是" a"。您的计数将因前导空格的数量而减少。

于 2013-05-22T22:19:37.377 回答
1
  1. 将您的代码分成执行特定操作的函数:从文件中读取数据,计算每个输入的按键次数,输出结果

好处:您可以独立测试每个功能。对代码进行推理也更容易。

  1. 输入的最大大小为 100,这意味着\0每个输入只需要 101 个字符(包括 final )的数组,而不是 1000。

  2. 由于此问题也被标记C++为尝试在您的代码中使用std::vector和。std::string

  3. for粗略一看,内部似乎是正确的。拥有计算按键次数的专用函数的好处是,您可以轻松验证它是否正确。确保彻底检查。

于 2013-05-22T20:19:24.117 回答