保持一个大数字的一部分

时间:2016-11-18 07:46:49

标签: c++ algorithm bignum

我写下面的程序来提取n号的最后五位数,这是下面函数的答案:

  

n = 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 个答案:

答案 0 :(得分:2)

“获取最后五位数”意味着mod 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;
}

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