2016-11-18 41 views
0

我已经写了下面的程序提取的是以下功能的回答n号的最后五位数字的一部分:保持一个大数目

N = 1^1 + 2^2 + ... + 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

【计算POW(A,B)MOD N](可能的重复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

“获取最后五位数”意味着mod 100000.实际上,100^100确实很小。由于(a * b)mod n =((a mod n)*(b mod n))mod n,所以在这种情况下不需要使用bignum。

#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; 
} 

为真正的大N,你可以看看https://en.wikipedia.org/wiki/Modular_exponentiation

+0

100^100比数字大10^120倍宇宙中的原子。不完全“非常小”。 – molbdnilo

+0

我就这个问题说:)只有5个最后的数字,它永远不会超过100000. –

+0

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