2015-12-19 2 views
2
#include <iostream> 
#include <string> 
#include <cmath> 
using namespace std; 

int main() 
{ 

    int n, k, g; 
    float fact; 

    cin >> n; 

    fact = sqrt(3.14159265359)*pow(n/2.7182818284, n); 
    fact *= pow(((8*n + 4)*n + 1)*n + (float)1/30, (float)1/6); 

    k=floor(fact); 

    g=k%1000000000; 

    cout << g << "\n"; 

}; 

Моя программа вычисляет значение n! modulo 1000000000. При малых значениях n он работает хорошо. Но для более крупных он постоянно выводит -147483648. Что случилось с моим кодом?Неверный выход - аппроксимация Рамануджана факториала и C++

ответ

2

Это проблема переполнения вашей переменной fact, вы получаете максимум, чем может удерживать float.

На самом деле даже более крупные типы, такие как long double и long long int, не будут содержать эти огромные значения, вам нужны более крупные типы.

Я предлагаю разрешить его, зацикливая 1 на n, умножая на каждой итерации и применяя также мод. Это будет держать число маленьким.

факторное приближение Рамануджана не поможет здесь, потому что не считает моды преимущества, вы можете попробовать Wilsom Theorem

+0

Великими, так который тип данные следует использовать? В моем учебнике на C++ особенно рекомендуются плавания для таких целей. – VanDerWarden

+0

Какой ваш максимум для n? –

+0

Ровно 1 000 000 000. – VanDerWarden