2016-09-25 81 views
0

我經歷了下面提到的教程,我試着計算C和Java中模數的倒數,但在這兩種情況下,我都將輸出作爲0,請指導我糾正我的代碼。在C和Java中使用哪種數據類型來計算數的模逆?

https://www.hackerearth.com/practice/math/number-theory/multiplicative-inverse/tutorial/

import java.lang.Math; 
import java.util.*; 
import java.math.BigInteger; 
import java.math.BigDecimal; 
class TestClass { 
    public static void main(String args[]) throws Exception { 
     Scanner sc=new Scanner(System.in); 
     int a=sc.nextInt(); 
     BigInteger bi=BigInteger.valueOf(a); 
     BigInteger k = new BigDecimal(Math.pow(10,9)).toBigInteger(); 
     BigInteger b=k.add(BigInteger.valueOf(7)); 
     BigInteger c=b.subtract(BigInteger.valueOf(2)); 
     BigInteger m=bi.modPow(c,BigInteger.valueOf(1)); 
     BigInteger d=m.mod(b); 
     System.out.println(d); 

    } 
} 

在C,

#include <stdio.h> 
#include<inttypes.h> 
#include<math.h> 
int main() 
{ 
    uintmax_t a; 
    scanf(" %ju",&a); 
    uintmax_t b=pow(10,9); 
    uintmax_t m=b+7; 
    uintmax_t c=((uintmax_t)pow(a,m-2))%(m); 
    printf("%ju",c); 
    return 0; 
} 

我不能到這裏溢出背後的原因,請澄清這一點。

+0

沒有'BigInteger'或'BigDecimal'在C.如果你想任意大小的整數,你需要自己編寫代碼或使用一個附加庫。不用說,任何需要超過64位整數的「hackerrank」問題都可以在支持這些類型的語言中得到更好的解決,「C」不是這些語言之一。此外,[不要使用pow()如果你的指數是整數](http://stackoverflow.com/questions/25678481/why-does-pown-2-return-24-when-n-5-with-my -compiler-and-os) – PaulMcKenzie

+1

我認爲溢出的原因在這裏:'((uintmax_t)pow(a,m-2))'任何'a> 1'如果提升到功率將會難以想象地大'10^9',肯定大於'uintmax_t'表示的最大數字。 –

+0

pow()函數是double類型,結果可能是在整數上下文中可以,可能不是 –

回答

1

Java代碼不起作用的原因是

BigInteger m=bi.modPow(c,BigInteger.valueOf(1)); 

計算bi^c mod 1,這是0任何bic

要計算什麼是bi^c mod b,其作爲

BigInteger m = bi.modPow(c, b); 

由於C沒有powmod功能,你需要它自己的程序編碼。

下面的函數計算x^e mod m

uintmax_t powmod(uintmax_t x, uintmax_t e, uintmax_t m) { 
    uintmax_t result = 1; 
    while (e > 0) { 
     if (e&1) { 
      result = result * x % m; 
     } 
     x = x * x % m; 
     e >>= 1; 
    } 
    return result; 
} 
+0

它在java中工作,如何解決C – user123

+0

@ user123中的問題我爲C添加了powmod函數 –

+0

我無法理解(e&1)結果=結果* x%m; }這意味着如果指數是奇數,那麼結果=結果* x%m,不能得到這一點。 – user123

相關問題