#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 桁の積を収めるのに十分な大きさです。
このロジックの欠陥は何ですか??