我正在尝试解决 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;
}
有什么想法解决这个问题吗?谢谢。
答案 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并对数字求和;甚至可能同时做那个部分。但是您将无法使用任何内置类型来表示该数字。这就是让这个问题变得有趣的原因。