2016-06-29 1 views
4

숫자의 4 승수를 얻고 싶습니다. 여기에 내 코드 : 그것은 잘 작동하지만 문자열로 변환이 불필요한 것, 그리고 % 연산자를 사용하는 a.remainder(b)보다 더 간결 것Integer.toString()을 우회하는 BigInteger의 조작

static int testMod(int a, int mod) { 

/* //This looks clear 
    BigInteger a4 = a;  
    return (a4.pow(4))%mod; 
*/ 

    //This works 
    String a2String = Integer.toString(a); 
    String mod2String = Integer.toString(mod); 
    BigInteger a4 = new BigInteger(a2String); 
    BigInteger modBigInt = new BigInteger(mod2String); 
    a4 = a4.pow(4); 

    return a4.remainder(modBigInt).intValue(); 
} 

. 더 명확하게 재 작성하는 것이 가능합니까?

+0

#remainder의는 "4"전원 "네번째"또는이어야한다. – mbomb007

+0

https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#valueOf-long- –

+0

a4가 long보다 클 수 있으므로 잠재적으로 정밀도를 잃어 버리고 잘못된 값을 반환합니다. modulus 연산을 수행하기 위해 a4를 int로 변환하면 대답하십시오. – user3745362

답변

5

당신이 BigInteger.valueOf(long)를 사용하여 String을 통해 변환을 제거 할 수 있습니다 intBigInteger으로 변환하십시오. 그러나 % 연산자를 BigInteger 피연산자에 적용 할 수는 없습니다. 가능한 경우 BigInteger.remainder()은 존재하지 않습니다. 반면에 @LouisWasserman이 관찰하는 것처럼 하나의 호출에서 지수 및 나머지를 수행하는 BigInteger.modPow()이 있습니다.

또한 BigInteger은 인식 할 때 메서드 체이닝을 지원합니다. 당신이 원하는 경우 하나의 문에서 모든 일을 할 수 있지만, 나는이 간결하고 가독성 사이 좋은 타협 생각 :

static int testMod(int a, int mod) { 
    BigInteger bigA = BigInteger.valueOf(a); 
    BigInteger bigMod = BigInteger.valueOf(mod); 

    return bigA.modPow(BigInteger.valueOf(4), bigMod).intValue(); 
} 
+1

왜'BigInteger.modPow'를 사용하지 않습니까? –

+0

@ 루이스 와서 만, 왜 그렇게하지 않았습니까? 나는 좋은 반응이 없다. 업데이트 됨. –

+0

흠. 난 당신이 실제로'bigA.modPow (BigInteger.valueOf (4), bigMod)'를해야만한다고 생각합니다. 그것은 수치 스럽지만, 여전히 가치가 있다고 생각합니다. –

3

나는 이것이 더 나은인지 아닌지 모르겠지만,이 String에 불필요한 변환 없애는 및 백업 :

static int testMod(int a, int mod) 
{ 
    BigInteger a4 = BigInteger.valueOf(a).pow(4); 

    return a4.remainder(BigInteger.valueOf(mod)).intValue(); 
} 
1

이 제시되지 않은하지만 당신은 또한 가볍게하기 위해 import static를 사용하여 생각할 수있다 코드 또한 방법 BigInteger#mod 대신

import java.math.BigInteger; 
import static java.math.BigInteger.valueOf; 


public class BigInt { 
    public static void main(String[] args) { 
     System.out.println(testMod(5,36)); // 13 
     System.out.println(testMod(250, 999)); // 160 
    } 

    public static int testMod(int a, int mod) { 
     return valueOf(a).pow(4).mod(valueOf(mod)).intValue(); 
    } 
} 
관련 문제