[java][boj][s1] 1629. 곱셈
728x90

https://www.acmicpc.net/problem/1629

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

문제

자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

출력

첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.

풀이

/*
 * 입력
 * 1. A B C
 * 출력
 * 1. A를 B 번 곱한 수 이를 C로 나눈 나머지
 * 
 * >> B를 반으로 계속 쪼개서 1이 나오면 계산
 * >> A를 C로 나눠서 나머지를 계산
 */

재귀를 이용해서 B가 1이 될 때까지 분할한 뒤 하나씩 곱해 나가는 방식으로 구했다 C로 나눈 나머지로 구해야 하기 때문에 계속해서 나눠서 곱해 줬더니 오류가 났다 알고 보니 나눈 뒤 곱하는 게 아니라 곱한 뒤 나머지로 나눠야 그 값이 구해진다 왜 안 되는 건지는 잘 모르겠지만... 틀린 부분은 주석 처리했다

코드

package lv20_분할정복;

import java.util.*;
import java.io.*;

public class s1_1629_곱셈 {
	static long A, B, C;
	static long ans;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		A = Long.parseLong(st.nextToken());
		B = Long.parseLong(st.nextToken());
		C = Long.parseLong(st.nextToken());
		
		ans = pow(A%C, B);
		
		System.out.println(ans%C);
	}

	private static long pow(long a, long b) {
		System.out.println("리턴" + b);
		//b가 0일 때 1 리턴
		if(b==0) return 1;
		//b가 1일 때 a 리턴
		if(b==1L) return a;
		
		ans = pow(a, b/2);
		System.out.println("리턴" + b);
		//ans = ans%C * ans%C;
		ans = ans*ans%C;
		
		//b가 홀수일 경우 a를 한 번 더 곱해 줌
		//if(b%2==1L) ans *= A%C;
		if(b%2==1L) ans *= A;
		
		//return ans;
		return ans%C;
	}

}

결과

 

#자바 #java #boj #백준 #알고리즘

728x90

'알고리즘 > BOJ' 카테고리의 다른 글

[java][boj][s2] 9184. 신나는 함수 실행  (0) 2022.03.08
[java][boj][s3] 1904. 01타일  (0) 2022.03.08
[java][boj][b1] 2740. 행렬 곱셈  (0) 2022.03.04
[java][boj][s2] 1780. 종이의 개수  (0) 2022.03.04
[java][boj][s3] 2491. 수열  (0) 2022.03.03