我的UVa代码出了什么问题

时间:2013-05-22 20:05:03

标签: c++

我试图在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;
}

2 个答案:

答案 0 :(得分:2)

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

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

  

&LT;空间&gt;&lt;空间&gt; a

输出应该是3(两个'0'和一个'2'键),但尝试读取行外的数字将消耗两个前导空格字符,后面的gets将读取字符串"a",而不是" a"。你的计数将被领先的空格数量所取消。

答案 1 :(得分:1)

  1. 将您的代码分成执行特定操作的函数:从文件中读取数据,计算每个输入的按键次数,输出结果
  2. 优点: 您可以单独测试每个功能。对代码进行推理也更容易。

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

    2. 由于此问题也标记为C++,请尝试在代码中使用std::vectorstd::string

    3. 内心for似乎正好粗略一瞥。具有计算按键次数的专用功能的装备是,您可以轻松验证它是否正确。确保彻底检查。