我得到的答案是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')
}
答案 0 :(得分:2)
你的回答是关闭的,因为在
行double digits = pow(2, 1000);
您将结果存储为double
,但double
在表示此大的整数时会失去精度,因为它使用floating point representation。
你应该使用一个整数,并且可能在乘法循环中迭代地计算数字的总和,在每次迭代时减少结果。否则,您需要使用大型int库,例如Boost.Multiprecision。后者的简单例子:
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
int main()
{
using namespace boost::multiprecision;
// Repeat at arbitrary precision:
cpp_int u = 2;
cpp_int result = pow(u, 1000);
int sum = 0;
for (auto elem : result.str()) // use the string representation
sum += elem-'0';
std::cout << result.str() << std::endl; // prints 2^1000
std::cout << sum << std::endl; // prints the sum of the digits
}
修改强>
我意识到在这种情况下,@ HamZa在你的回答下面的评论是正确的。 double
范围内的2的幂被忠实地表示为浮点表示,因此在这种情况下您不会失去任何精度。问题确实是字符串表示中出现的.0000
。但是,如果您使用3
作为基础,则所有投注均已关闭,您不能简单地使用std::pow
。
答案 1 :(得分:0)
您也可以使用此转化方法
#include <iostream>
# include <cmath>
# include <string>
using namespace std;
int main() {
cout<<std::to_string(pow((double)2,1000));
return 0;
}