原题:2、123456789的123456789次方 % 987654321 = ? 解法:public static int Calc2(int a, int b, int n) { var d = (long)a; var r = 1; while (b > 0) { if ((b & 1) != 0) r = (int)((r * d) % n); d = (d * d) % n; b >>= 1; } return r; } Calc2(123456789, 123456789, 987654321);参考:Snowdust 反复平方法 public static long ModularExponentiation(int a, int b, int n) { string str = Convert.ToString(b, 2); int[] arr = new int[str.Length]; for (int i = 0; i < arr.Length; i++) { arr[i] = Convert.ToInt32(str[arr.Length - 1 - i].ToString()); } int c = 0; long d = 1; for (int i = arr.Length - 1; i >= 0; i--) { c *= 2; d = (d * d) % n; if (arr[i] == 1) { c++; d = (d * a) % n; } } return d; }
解法:public static int Calc2(int a, int b, int n)
{
var d = (long)a;
var r = 1;
while (b > 0)
{
if ((b & 1) != 0)
r = (int)((r * d) % n);
d = (d * d) % n;
b >>= 1;
}
return r;
}
Calc2(123456789, 123456789, 987654321);参考:Snowdust 反复平方法
public static long ModularExponentiation(int a, int b, int n)
{
string str = Convert.ToString(b, 2);
int[] arr = new int[str.Length];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = Convert.ToInt32(str[arr.Length - 1 - i].ToString());
}
int c = 0;
long d = 1;
for (int i = arr.Length - 1; i >= 0; i--)
{
c *= 2;
d = (d * d) % n;
if (arr[i] == 1)
{
c++;
d = (d * a) % n;
}
}
return d;
}