2

ハッシュを作成するために数字をインデックスに掛けて追加しようとしていますが、正しい出力が得られないようです。ここで何が問題なのか誰か教えてもらえますか?

int main(){
    int i, hash=0, input;
    char temp[30];

    cin>>input;

    itoa (input, temp, 10);

    for(i=0; i<(sizeof(temp)/sizeof(*temp)); i++){
        hash+=((temp[i])*i);
    }

    cout<<hash;

    return 0;
}
4

3 に答える 3

1

はい、stdin から読み取っている整数の ASCII 表現のみをハッシュするのではなく、temp[30] の 30 バイトすべてをハッシュしています。

これはあなたが望むものに近いと思います:

#include <iostream>
using namespace std;

int main() {
    int hash = 0;

    // Read input from stdin
    std::string input;
    std::cin >> input;

    // Make sure it contains only numbers
    if (input.find_first_not_of("0123456789") != std::string::npos) {
        std::cout << "Input doesn't contain only digits" << std::endl;
        return 1;
    }

    for (int i = 0; i < input.size(); i++) {
        hash += (input[i] - '0') * i;
    }

    std::cout << hash << std::endl;
    return 0;
}
于 2013-10-01T01:09:06.487 に答える
1

これitoa()は、C-String を返すためです。

すべての C-String は ( と同様にtemp[30]) バッファーですが、すべてのバッファーが C-String であるとは限りません。

C-String には、有効なもののリストからの文字 (英数字 + いくつかの記号 + など) を含める必要があり、「文字列ターミネータ」(文字'\0')で終了する必要があります。

あなたのtemp変数は初期化されていません(まだ文字列ではなく、汎用バッファとして生まれたと言えます)。そのためitoa()、「数値」を文字列に変換した後(バッファはC文字列になりました)、文字列の後にターミネータ ( '\0') を初期化していないと、ゴミが残ります。

バッファは次のようになります。

temp[30] = { '1', '2', '3', '\0', ?, ?, ?, ..., ? }

? _ は何でもかまいません...

バッファtemp[30]全体をループするため、常にさまざまなものの合計を作成します。

  • 解決策 1: char temp[30] = { 0 } を初期化します (少しばかげていますが、有効です)。
  • 解決策 2:バッファ全体ではなく、 C-String の「長さ」までループしますtemp(これはより理にかなっています!)

これこれ:

size_t length( strlen( temp ) );

for ( size_t i( 0 ); i < length; i++ )
{
    hash += (int)i * temp[ i ];
}
于 2013-10-01T01:11:01.423 に答える
0

その temp[] バッファは itoa() によって完全には満たされないため、i=0 から (sizeof temp)-1 までループすると、ガベージをハッシュすることになります。試す:

for (size_t i=0, n=strlen(temp); i<n; ++i)
{
    hash += (int)i*temp[i];
}

<cstring>strlen() を定義するには、含める必要があります。

よく考えてみると、 no-<cstring>アプローチの方がおそらく優れています。

for (int i=0; temp[i] != 0; ++i)
{ 
    hash += i*temp[i]; 
}

これにより、 (int) キャストも削除されます。

于 2013-10-01T01:10:06.430 に答える