仅使用整数计算 2^n%k

Calculating 2^n%k using only integers

我需要编写一个代码来获取 2 个变量 (n,k) 并将答案打印到 (2^n)%k。

我只能使用整数,不能使用方法,不能使用数组,不能使用数学。等等。 到目前为止我有这个:

int n = myScanner.nextInt();  
    int k = myScanner.nextInt();   
    int num = 1;
    int modulo = 1;
    for (int i = 0; i < n; i++) {    
            num = num * 2;  
            modulo *= 2%k;

    }

    modulo = modulo%k;
    System.out.println(modulo);

问题是 int 本身的范围,不超过 2^31...但我仍然需要以某种方式让它工作,任何帮助将不胜感激!

如果您的问题是它不能存储超过 2^31,那是因为您需要使用 long 数据类型来存储值。一个 long 可以存储最大值 2^63(有符号)。

您正在处理 Modular exponentiation。一种可能的解决方案是避免大数乘法,这会溢出 int,方法是利用以下内容:

Given two integers a and b, the following two equations are equivalent:

c mod m = (a ⋅ b) mod m

c mod m = [(a mod m) ⋅ (b mod m)] mod m

在 Java 中,一个简单的解决方案基于此 section 中解释的算法:

int mod(int base, int exponent, int modulus) {
  if (modulus == 1) return 0;
  int c = 1;
  for (int i = 0; i < exponent; i++) {
    c = (c * base) % modulus;
  }
  return c;
}