【发布时间】:2015-05-26 19:15:16
【问题描述】:
我得到的答案是 1364,但正确的答案是 1366。
我得到错误答案是因为我将double digits = pow(2,1000) 转换为string dig = std::to_string(digits),还是我还缺少其他东西?
#include <iostream>
using std::endl; using std::cout;
#include <string>
using std::string;
#include <cmath>
int computeSum(string);
int main(void){
double digits = pow(2,1000);
string dig = std::to_string(digits);
cout << computeSum(dig) << endl;
return 0;
}
int computeSum(string dig){
int sum(0);
for(char n : dig)
sum+=(n-48); // or (n-'0')
return sum;
}
编辑:
解决方案:
我需要添加if (n!='.') 条件,因为(n-48) 将. 转换为其ASCII 值46,给我一个-2。
for(char n : dig){
if(n!='.')
sum+=(n-48); // or (n-'0')
}
【问题讨论】:
-
我在 PHP 中使用了 BC 数学 来解决这个问题。在谷歌搜索 C++ 替代品后,我发现 the following repository.
-
这就是为什么其中一些问题存在偏见,具体取决于所使用的语言。这对于使用
Java和BigInteger类来说是微不足道的。 C++ 没有这样的内置功能,除非你使用第三方库。 -
我发现了问题。当您计算 2 ^ 1000 并将其存储在
digits中时。结果将有一个点(很明显!)。当您将其转换为字符串时,它仍将包含此点。现在一个点是 46,删除 48 你得到 -2。所以当你遍历你的字符串时,它会偶然发现点并添加-2。有你的2位数的问题。您可以在 for 循环中添加 if 语句,以在遇到点字符时返回总和。 -
HamZa,你这个天才。那行得通。我添加了一个
if (n!='.'),现在答案是正确的。 -
@ishyfishy 我现在开始想知道你得到的是可移植的还是实现定义的。这似乎非常可疑,我不会打赌。在这种情况下可能没问题,因为您使用的是 2 的幂。
标签: c++