long long encrypt(int message,int n,int e)
{
long long s=pow(message,e);
return s%n;
}
当我尝试这个时:
printf("%lli",encrypt(65,3233,17));
打印出来: -2631
有没有人知道如何解决这个问题...说实话,现在这些价值很小......我想我将来会使用更大的价值
答案 0 :(得分:3)
您的系统上long long
可能是64位。您可以输入的最大(十进制)数字是9,223,372,036,854,775,807。你试图将65 17 合二为一 - 这是6,599,743,590,836,592,050,933,837,890,625。溢出!
您需要使用某种大数字库来完成这些操作,并且具有完美的精度。有很多可用的 - 例如GMP。
答案 1 :(得分:3)
也许这样做:
int encrypt(int message,int n,int e)
{
int s = 1;
while (e--) {
s = ( s * message ) % n;
}
return s;
}
答案 2 :(得分:0)
我们在Mathmatics中有如下定理: *(a * b)%p =(a%p * b%p)%p * 所以我们可以得到这个:
*(一^ E)%N =(A(E-1)%P *的%P)%P *
所以我们可以得到这样的代码:
int encrypt(int message,int n,int e)
{
int result = 0;
if(1 == e)
{
return message%n;
}
else
{
result = encrypt(message,n,e-1);
}
return (result%p * message%p)%p;
}