项目欧拉#16:回答2位数

时间:2015-05-26 19:15:17

标签: c++

我得到的答案是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')  
}

2 个答案:

答案 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;
}

http://ideone.com/MZp1tN