尝试将数字乘以其索引

Trying to add digits times their index

本文关键字:索引 数字      更新时间:2023-10-16

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

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

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

每个 C 字符串都是

一个缓冲区(就像 temp[30] 一样(,但不是每个缓冲区都是 C 字符串。

C 字符串必须

包含有效事物列表中的字符(字母数字 + 一些符号 + 等(,并且必须以"字符串终止符"(字符''

你的temp变量没有初始化(我们可以说它诞生于一个通用缓冲区,还不是一个字符串(,所以itoa()之后,你的"数字"将转换为字符串(你的缓冲区刚刚变成了一个 C 字符串(,但是在字符串终止符 ( '' ( 之后,一旦你没有初始化它,你就会有垃圾!

您的缓冲区将如下所示:

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

可以是任何东西...

因为你循环整个缓冲区温度[30],所以你会一直做不同事情的总和。

  • 解决方案 1:初始化 char temp[30] = { 0 }(有点愚蠢,但有效(
  • 解决方案 2:循环到 C 字符串temp的"长度",而不是整个缓冲区(这一个更有意义!

这个:

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

是的,您正在散列所有 30 个字节的 temp[30],而不是仅散列您从 stdin 读取的整数的 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;
}

该 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((。

再三考虑,不<cstring>的方法可能更好:

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

这也消除了(整数(强制转换。