2014-09-01 128 views
-2

我的算法计算下面给出的算术运算,为它完美的小值,但对于大量的,如218194447它返回一个随机值,我曾试图用很长很长整型,双,但没有工作,因为模函数我有使用只能用int型可以使用,任何人都可以解释如何解决,或可提供可能是有用的一个环节模函数只适用于整数数据类型吗?

#include<stdio.h> 
#include<math.h> 

int main() 
{ 
    long long i,j; 
    int t,n; 

    scanf("%d\n",&t); 

    while(t--) 
    { 
     scanf("%d",&n); 

     long long k; 
     i = (n*n); 
     k = (1000000007); 
     j = (i % k); 

     printf("%d\n",j); 
    } 

    return 0; 
} 
+0

请缩进/格式化您的代码,使其可读。谢谢。 – 2014-09-01 19:12:19

+2

可能重复: - http://stackoverflow.com/questions/2177781/how-to-calculate-modulus-of-large-numbers – 2014-09-01 19:13:34

+0

无关:只是用'1000000007'似乎比重新计算'战俘相当清晰的(10,9 )+ 7',我们只能希望一个合理智能的编译器进行优化。 – WhozCraig 2014-09-01 19:19:59

回答

1

你可以声明你的变量为int64_tlong long;那么他们将计算它们范围内的模数(例如int64_t的64位)。只有所有中间值都适合其范围,它才能正常工作。

不过,你可能想要或需要bignums。我建议你学习和使用GMPlib

顺便说一句,因为它在浮点计算不使用pow。尝试i = n * n;而不是i = pow(n,2);

P.S.这不是在C编程初学者,使用gmplib需要一定的流畅度C语言编程(和编程一般)

1

在你的代码的问题是,你计算的间歇值超过值的范围可以存储在一个int中。对于n> 2^30的值,n^2不能表示为int。

请按照以上链接给R.T.在大数字上做模数的方法。这还不够,因为你还需要一个可以处理大整数值的类/库。只有标准的C库,否则这将是一项自己的任务。 (好吧,对于2^31,64位整数可以,但如果你要变大,你又不幸运了)

0

接受后回答

为了找到提高到一些权力一些n的模p(在OP的情况下为2),则不需要第一个计算power(n,p)。相反,计算中间模数值为n将提升至中等能力。

以下代码与OP所需的p==2一起使用,但如果p=1000000000也可以快速工作。

唯一需要的更宽的整数是是两倍宽n整数。

执行这一切都是无符号整数简化了所需的代码。

生成的代码非常小。

#include <stdint.h> 

uint32_t powmod(uint32_t base, uint32_t expo, uint32_t mod) { 
    // `y = 1u % mod` needed only for the cases expo==0, mod<=1 
    // otherwise `y = 1u` would do. 
    uint32_t y = 1u % mod; 

    while (expo) { 
    if (expo & 1u) { 
     y = ((uint64_t) base * y) % mod; 
    } 
    expo >>= 1u; 
    base = ((uint64_t) base * base) % mod; 
    } 

    return y; 
} 

#include<stdio.h> 
#include<math.h> 

int main(void) { 
    unsigned long j; 
    unsigned t, n; 

    scanf("%u\n", &t); 

    while (t--) { 
    scanf("%u", &n); 

    unsigned long k; 
    k = 1000000007u; 
    j = powmod(n, 2, k); 

    printf("%lu\n", j); 
    } 

    return 0; 
} 
相关问题