2016-11-18 7 views
0

я написал ниже программу, чтобы извлечь последние пять цифр п числа, которое является ответом функции ниже:Сохраняя часть большого числа

п = 1^1 + 2^2 + ... + m^m

где m задано пользователем. Программа работает нормально для небольшого числа, но она не будет работать на m, равной 100^100.

#include <iostream> 
#include <math.h> 
using namespace std; 

int main() 
{ 
    int n; 

    cin>>n; 
    intmax_t a[n],num,rem; 
    a[0]=0; 
    for (int i=1; i<=n; i++){ 

    a[i] = a[i-1]+pow(i,i); 
    } 

    num=a[n]; 

    int b[5]; 
    for (int i = 1; i <=5; i++) { 
    rem = fmod(num,10); 
    b[i]=rem; 
    num = num/10; 
    } 

    for (int i = 1; i <=5; i++) { 
    cout<< b[i]; 

    } 
    return 0; 
} 
+1

Возможный дубликат [Расчет мощн (а, б) по модулю п] (http://stackoverflow.com/questions/8496182/calculating-powa -b-mod-n) – ruakh

+0

Две проблемы: во-первых, C++ не имеет [массивы переменной длины] (https://en.wikipedia.org/wiki/Variable-length_array) (некоторые компиляторы имеют это расширение , но, пожалуйста, избегайте этого в пользу, например, 'std :: vector'). Во-вторых, когда вы делаете 'num = a [n];' вы индексируете 'a' вне пределов. Ваши циклы также индексируют массивы (как 'a', так и' b') за пределами границ. Помните: индексы массива основаны на * ноль *. –

+0

Кроме того, 'fmod' предназначен для типов с плавающей запятой – George

ответ

2

«Получить последние пять цифр» означает модель 100000. Фактически, 100^100 действительно мало. В этом случае вам не нужно использовать bignum, так как (a * b) mod n = ((mod n) * (b mod n)) mod n.

#include <iostream> 
using namespace std; 

int getLastDigits(int base, int pow, int numDigit) { 
    int divisor = 1; 
    for (int i = 0; i < numDigit; i++) 
     divisor *= 10; 

    int retVal = 1; 
    for (int i = 0; i < pow; i++) { 
     retVal *= base; 
     retVal %= divisor; 
    } 

    return retVal; 
} 

int main() 
{ 
    int n; 

    cin>>n; 
    int res = 0; 
    for (int i=1; i<=n; i++){ 
     int tmp = getLastDigits(i,i,5); 
     //cout << tmp; 
     res += tmp; 
    } 

    cout << res % 100000; 
    return 0; 
} 

FOr действительно большой п, вы можете посмотреть на https://en.wikipedia.org/wiki/Modular_exponentiation

+0

100^100 в ~ 10^120 раз больше, чем число атомов во Вселенной. Не совсем «очень мало». – molbdnilo

+0

Я говорю в терминах этой проблемы :) только пять последних цифр и она никогда не превышает 100000. –

+0

И 100^100 = (10^2)^100 = 10^200 @molbdnilo –

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