【问题标题】:Trying to add digits times their index尝试将数字乘以它们的索引
【发布时间】:2013-10-01 01:03:09
【问题描述】:

我正在尝试将数字乘以它们的索引以创建哈希,但这似乎没有给出正确的输出。谁能告诉我这里出了什么问题?

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;
}

【问题讨论】:

  • 为什么不直接做string str; cin &gt;&gt; str?另外,你真的不应该使用using
  • itoa 既不是标准 C 也不是 C++ 函数。

标签: c++ hash


【解决方案1】:

这是因为itoa() 返回一个 C 字符串。

每个 C-String 都是一个缓冲区(就像 temp[30]),但不是每个缓冲区都是一个 C-String。

C-String 必须包含来自有效事物列表的字符(字母数字 + 一些符号 + 等),并且必须以“字符串终止符”(字符 '\0')结尾

您的 temp 变量未初始化(我们可以说它是作为通用缓冲区诞生的,而不是字符串),因此在 itoa() 之后,您的“数字”将转换为字符串(您的缓冲区刚刚变成C-String),但是在字符串终止符 ('\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 ];
}

【讨论】:

  • 我尝试按长度结束循环,但它没有给出正确的输出。输入:10 输出:48 ((1*0)+(0*1)=0) 这显然是错误的。
  • 1 = 1, 0 = 0, '1' != 1, '0' != 0 ...不要将数字 0 与字符 '0' 混淆
【解决方案2】:

是的,您正在对 temp[30] 的所有 30 个字节进行哈希处理,而不是仅对您从标准输入读取的整数的 ascii 表示进行哈希处理。

我认为这更接近你想要的:

#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;
}

【讨论】:

  • 我试过这样做,但它仍然没有给出正确的输出。放入 10 得到 48,其中 (1*0)+(0*1)=0 不等于 48。
  • @user2027369 好的,现在我想我明白你想要什么了。查看更新的答案。
【解决方案3】:

那个 temp[] 缓冲区没有被 itoa() 完全填满,所以如果你将 i=0 循环到 (sizeof temp)-1,你就会散列垃圾。试试:

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

您需要包含 &lt;cstring&gt; 来定义 strlen()。

再想一想,no-&lt;cstring&gt; 方法可能更好:

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

这也消除了 (int) 演员表。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2021-02-18
    • 2015-05-27
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多