尝试将字符串数组转换为int但在C ++中不起作用

时间:2015-06-26 06:55:59

标签: c++ arrays

我正在尝试解决 Project Euler Problem#16 https://projecteuler.net/problem=16。它要求我总结2 ^ 1000的结果中的每个数字。

通过将字符串视为数组来迭代字符串(从double类型转换)。但是,当我尝试将字符串数字转换回int时,我总是遇到错误。

我尝试了stoi,它提示我"no matching function for call to 'atoi'"。我还尝试使用stringstream进行转换,但仍无效。

请参阅以下代码:

#include <iostream>
#include <complex> // pow
#include <string> // to_string C++ 11

const double NUM = pow(2, 1000);

int main(int argc, char const *argv[]) {
    int sum = 0;
    //printf("%.0f\n", NUM); // Remove decimal digits
    auto str = std::to_string(NUM);
    std::string str_trim = str.substr(0, str.length()-7);
    std::cout << str_trim << std::endl; // 2^1000 in string

    for (int i = 0; i <= str_trim.length(); i++) {
        std::cout << str_trim[i] << std::endl;
        sum = sum + str_trim[i];
        std::cout << sum << std::endl;
    }
    return 0;
}

有什么想法解决这个问题吗?谢谢。

3 个答案:

答案 0 :(得分:3)

纯粹巧合的是,这种方法在大多数编译器上都能正常工作2 ^ 1000,因为IEEE754双格式(C ++中浮点数的最常见格式)完成的舍入将通过将它们视为零来丢弃位(和在2^1000中,这些位确实是零。)

总结数字,你可以迭代字符并执行

total += s[i] - '0';

使用C ++中chars确实是小整数的事实。

答案 1 :(得分:0)

如果您需要将std::string转换为int,请使用std::stoi。 C ++还为其他类型提供了一些其他功能:std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod, std::stold

仍然没有C ++类型可以容纳2 ^ 1000,因此您无法为这些值使用标准类型和标准函数。

答案 2 :(得分:0)

即使您设法从NUM中提取数字,您的答案也会不正确:

const double NUM = pow(2, 1000);

不能依赖

来准确存储数字。

解决此问题的另一种方法是以二进制形式计算2到1000次幂(结果很简单:它是1后跟1,000个零)。然后你的问题就会减少到将其转换回基数10并对数字求和;甚至可能同时做那个部分。但是您将无法使用任何内置类型来表示该数字。这就是让这个问题变得有趣的原因。