c++ - 保留一个大数字的一部分

标签 c++ algorithm bignum

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

n = 1^1 + 2^2 + ... + m^m

其中 m 由用户提供。该程序适用于小数,但不适用于 100^100 这样大的 m。

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

最佳答案

“取最后五位”的意思是mod 100000。其实100^100真的很小。在这种情况下您不需要使用 bignum,因为 (a*b) mod n = ((a 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;
}

对于真正大的n,可以看看https://en.wikipedia.org/wiki/Modular_exponentiation

关于c++ - 保留一个大数字的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40671825/

相关文章:

java - 如何从原始号码获取新号码?

javascript - 生成字符串的所有辅音

algorithm - 从 n 个元素的数组中找到 2 个子数组,这些元素的总和等于或接近

javascript - JavaScript 中处理大数(BigNum)的标准方案是什么?

java - 埃拉托色尼筛问题 : handling really big numbers

trigonometry - 像 mpmath 这样的任意精度库如何评估简单的三角函数?

c++ - 为什么我们需要创建一个单参数构造函数才能使用临时无名对象?

c++ - 从模板实例化/类型推导中查找错误消息的实际来源

c++ - thrift-cpp 的客户端是线程安全的吗?

c++ - 如何在 C++ 中单独给定一个 ProgID 来实例化一个类?