0

2^1000 の桁の和を求める

関数を使用して、ユーザーは 4^5 (基数 4、指数 5) などの基数と指数を入力します。

値とベクトルで出力された数字を比較すると、16 番目から失敗します。

私の試み:

#include<iostream>
#include<cmath>
#include<vector>
using namespace std; 


double Integer() {
    double m,o;  
    double n; 

    cout<<"Enter Base: ";
    cin>>m; 
    cout<<"Enter Exponent: ";
    cin>>o; 

    n= pow(m,o);

    cout.precision(302); 

    cout << "The Answer is: " << n << endl; 

    return n;
}

void SumoftheDigits(double n) { 

    double x, q, w=0, r, d;
    int length = r = (log(n)/ log(10)) + 1;

    vector<double> v1;

    modf((n/pow(10,r)),&x);

    while (r != 0) {

        q = modf( (n/pow(10,r-1)), &x);
        n -= x*pow(10,r-1);

        r--;
        d = x;

        v1.push_back(d);

    }

    for(vector<double>::iterator it = v1.begin(); it != v1.end(); ++it){
            cout << *it << " ";
    } 

    cout << endl; 

    int i;
    long long int Sum = 0; 

    while (i != v1.size()) {
        Sum += v1[i]; 
        i++;
    } 

    cout << "The Sum of the Digits is: " << Sum << endl; 

} 

int main() {

    double n = Integer(); 

    SumoftheDigits(n); 

    return 0;
}
4

1 に答える 1

3

浮動小数点型 (floatおよび などdouble) は精度が限られているため、2^1000 付近の値などの大きな数値を計算するために使用することはできません。あなたが見たように不正確さがあるでしょう。

これを行うには、整数メソッドを使用する必要があります。通常の整数では 2^1000 ほどの大きさの数値を表すことができないため、もう少し手間がかかります。たとえば、各桁を配列で個別に表し、学校で学んだ長い乗算を実装できます。

非常に大きな整数 (コンピュータのメモリによってのみ制限される) を表すことができる GMP などのライブラリもあり、これを使用すると、これを簡単に行うことができます。

于 2012-11-05T21:46:26.773 に答える