尝试将数字乘以其索引
Trying to add digits times their index
我正在尝试将数字乘以它们的索引以创建哈希,但这似乎没有给出正确的输出。谁能告诉我这里出了什么问题?
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 字符串。
一个缓冲区(就像 temp[30]
一样(,但不是每个缓冲区都是 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];
}
这也消除了(整数(强制转换。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 数组索引的值没有增加
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 查找最接近的大于当前数字的数字的索引
- 使用移位的无符号数字作为数组的索引号是一种很好的做法
- 查找数组中重复(重复)数字的索引
- 如何以正确的时区从XTS索引中获取数字时间?
- 根据另一个数字的可整除性返回子数组中的索引
- 使用二叉搜索查找数字的第 N 次出现的索引
- 循环并将数字的索引用作文件名
- 尝试为数字值编制索引。C++ & Lua
- 尝试将数字乘以其索引
- 对数字及其索引列表进行排序的最快方法
- 为什么我可以索引到数字超出范围的三维数组中,但仍然可以访问数组中的最后一个数字
- 带有Overload[]运算符的C++MyInteger类,因此索引在位置i返回数字
- 如果用户从数组中输入数字,如何获取 2D 数组的索引
- 将数组中的所有数字更改为其索引值
- 用户正在输入10个数字,找到最大的负值及其索引/位置