일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SECS/GEM
- 파이썬
- Gem
- 회귀
- java
- spring boot
- Spotify Api
- SECS-II
- MYSQL
- 프로그래머스
- SWEA
- SECS
- programmers
- C++
- Spring JPA
- modern c++
- Computer Science
- regression
- 회원가입
- CS
- python
- c
- linux
- Spring
- SW Expert Academy
- 자바
- 백준
- Baekjoon
- spotify
- 스포티파이
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 1629 곱셈 (JAVA) 본문
728x90
https://www.acmicpc.net/problem/1629
문제
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
출력
첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.
아래와 같이 pow를 새롭게 정의를 해주어 문제를 해결했습니다.
위의 문제의 경우, A, B, C의 수가 크기때문에 그냥 pow를 할 경우, 숫자를 초과하게 됩니다.
X*Y=Z 일 경우, ZmodC=(XmodC * YmodC) modC 를 활용을 해서 아래와 같이 문제를 해결했습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
long C = Long.parseLong(st.nextToken());
System.out.println(pow(A, B, C));
}
private static long pow(long a, long b, long c) {
if (b == 1) {
return a % c;
}
long temp = pow(a, b / 2, c);
if (b % 2 == 1) {
return (temp * temp % c) * a % c;
}
return temp * temp % c;
}
}
그리고 위의 코드를 좀더 간단하게 정의가 되있는 BigInteger를 사용하게 되면 위의 코드를 간단하게 줄일 수도 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
BigInteger A = new BigInteger(st.nextToken());
BigInteger B = new BigInteger(st.nextToken());
BigInteger C = new BigInteger(st.nextToken());
System.out.println(A.modPow(B, C));
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[Programmers 프로그래머스] 86971 전력망을 둘로 나누기 (JAVA) (0) | 2021.11.10 |
---|---|
[BAEKJOON 백준] 2407 조합 (JAVA) (0) | 2021.09.10 |
[BAEKJOON 백준] 11720 숫자의 합 (JAVA) (0) | 2021.09.10 |
[BAEKJOON 백준] 1546 평균 (JAVA) (2) | 2021.09.10 |
[BAEKJOON 백준] 11654 아스키 코드 (JAVA) (0) | 2021.09.10 |
Comments