2013-08-30 4 views
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^9. Но когда я иду на 10^10, он рушится.fmodl - Модуль в длинном двойном

Поэтому, чтобы использовать типы данных более высокого размера, я преобразовал число, которое нужно умножить на длинный двойной и умножить на них (что снова даст длинный двойной), поэтому, если мы возьмем модуль на этом номере, мы получим правильный ответ , Но я не получил правильного ответа снова, он вызывает тот же неправильный ответ.

Моя мысль сделать такую ​​вещь, как этот

  • неподписанный долго долго 8 байт, так как я Moding я хотел бы получить большое число как 10 цифр, так умножая 2, десять цифр номера будет не подходит в unsigned long long, поэтому он будет циклически работать в unsigned long long
  • поэтому для вышеуказанной точки я конвертирую беззнаковый длинный длинный в длинный двойной (это 12 байт), и поскольку он имеет большое пространство, он достаточно большой, чтобы соответствовать 20-разрядное произведение из 2 десятизначных чисел

Может ли кто-нибудь сказать, что является недостатком в этой логике?

+0

Возможно, вы правильно отделили функцию 'modExp' (как' main')? Кроме того, что такое объявление 'sec' в' main'? –

+0

Я редактировал код. –

ответ

2

Общая реализация long double не может точно представлять все десятизначные числа в 20 цифр.

Характеристики long double не полностью определены стандартом C++, и вы не указали, какую реализацию вы используете.

Одна общая реализация long double использует 64-разрядную значимость. Хотя он может храниться в двенадцати байтах, он использует только десять, а 16 из них используются для знака и экспонента, оставляя 64 для значимости (включая явный старший бит).

64-битный мантисса может представлять целые числа без ошибок до 2 , которая составляет около 1,845 • 10 . Таким образом, он не может точно представлять все 20-значные числа.

+0

Спасибо за ответ! Есть ли другой способ решить эту проблему? –

 Смежные вопросы

  • Нет связанных вопросов^_^