我經歷了下面提到的教程,我試着計算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;
}
我不能到這裏溢出背後的原因,請澄清這一點。
沒有'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
我認爲溢出的原因在這裏:'((uintmax_t)pow(a,m-2))'任何'a> 1'如果提升到功率將會難以想象地大'10^9',肯定大於'uintmax_t'表示的最大數字。 –
pow()函數是double類型,結果可能是在整數上下文中可以,可能不是 –