函数的返回值是意外的

时间:2013-07-10 23:44:00

标签: c

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

有没有人知道如何解决这个问题...说实话,现在这些价值很小......我想我将来会使用更大的价值

3 个答案:

答案 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;

}
相关问题