0
#include <iostream>
#include <cmath>

using namespace std;

unsigned long long modExp(unsigned long long b, unsigned long long e, unsigned long long m)
{
    unsigned long long remainder;
    unsigned long long x = 1;

    while (e != 0)
    {
        remainder = e % 2;
        e= e/2;

        // These lines
        if(remainder==1)
            x=(unsigned long long)fmodl(((long double)x*(long double)b),(long double)m);
        b=(unsigned long long)fmodl(((long double)b*(long double)b),(long double)m);
    }
    return x;
}

int main()
{
    unsigned long long lastTen = 0,netSum=0;
    unsigned long long sec(unsigned long long,unsigned long long);

    for(int i=1;i<1001;i++)
    {
        lastTen = modExp(i,i,10000000000);
        netSum += lastTen;
        netSum %= 10000000000;
        cout << lastTen << endl ;
    }

    cout << netSum%10000000000 << endl;
    cout << sizeof(long double) << endl;
    return 0;
}

これは、シリーズの合計の最後の 10 桁を計算する私のプログラムです。算術指数法を使用して、最後の 10 桁を計算します。10^9 でうまくいきます。しかし、10 ^ 10 に行くと崩壊します。

したがって、より大きなサイズのデータ​​型を使用するために、乗算する数値を long double に変換し、それらを乗算しました (これにより、再び long double が生成されます)。したがって、この数値にモジュラスを適用すると、正しく答えが得られます。しかし、私は再び正しい答えを得られなかったので、同じ間違った答えを引き起こします。

そんなものを作ろうと思ったのはこんな感じ

  • unsigned long long は 8 バイトです。私は改造しているので、10 桁の数字として大きな数を取得するので、2 を掛けると、10 桁の数字は unsigned long long に収まらないため、unsigned long long で循環します。
  • したがって、上記の点について、unsigned long long を long double (12 バイト) に変換します。スペースが大きいため、2 つの 10 桁の数字の 20 桁の積を収めるのに十分な大きさです。

このロジックの欠陥は何ですか??

4

1 に答える 1