我试图在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;
}
答案 0 :(得分:2)
在问题描述中,有一个数字表示之后输入中的文本数量。您的原始代码试图在每行输入之前读取数字。
尝试读取每一行中的数字将失败,因为输入字符集不包含任何数字,因此您可能倾向于认为应该没有区别。但是,当你尝试读取一个数字时,它将从消耗领先的空白开始。如果输入是:
&LT;空间&gt;&lt;空间&gt; a
输出应该是3(两个'0'和一个'2'键),但尝试读取行外的数字将消耗两个前导空格字符,后面的gets
将读取字符串"a"
,而不是" a"
。你的计数将被领先的空格数量所取消。
答案 1 :(得分:1)
优点: 您可以单独测试每个功能。对代码进行推理也更容易。
输入的最大大小为100,这意味着每个输入只需要101个字符的数组(包括最终\0
),而不是1000个。
由于此问题也标记为C++
,请尝试在代码中使用std::vector
和std::string
。
内心for
似乎正好粗略一瞥。具有计算按键次数的专用功能的装备是,您可以轻松验证它是否正确。确保彻底检查。