-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

問題の説明には、後で入力されるテキストの数を示す単一の数字があります。元のコードは、入力のすべての行の前に数値を読み取ろうとしていました。

入力文字セットには数字が含まれていないため、各行の数字を読み取る試みは失敗します。そのため、違いはないと考えがちです。しかし、数値を読み取ろうとすると、先頭の空白を消費することから始まります。入力が次の場合:

< スペース >< スペース >a

出力は 3 (2 つの '0' キーと 1 つの '2' キー) になるはずですが、行から数値を読み取ろうとすると、先頭の 2 つの空白文字が消費され、後でではなくgets文字列 が読み取られます。あなたのカウントは、先頭の空白の量だけずれます。"a"" a"

于 2013-05-22T22:19:37.377 に答える
1
  1. コードを特定のことを行う関数に分割します。ファイルからデータを読み取り、入力ごとにキーが押された回数を計算し、結果を出力します。

利点: 各関数を個別にテストできます。コードについての推論も容易になります。

  1. \0入力の最大サイズは 100 です。これは、入力ごとに 1000 ではなく、101 文字 ( final を含む) の配列のみが必要であることを意味します。

  2. この質問にもタグが付けられているので、コードでandC++を使用してみてください。std::vectorstd::string

  3. インナーforはパッと見で正しそう。キーを押した回数を計算する特殊な関数を持つことの利点は、それが正しいことを簡単に検証できることです。よく確認するようにしてください。

于 2013-05-22T20:19:24.117 に答える