[백준 BOJ] 1312번 소수 (C++/cpp)

2022. 10. 27. 15:53PS (Program Solving)/BOJ (백준)

문제 설명

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

 

1312번: 소수

피제수(분자) A와 제수(분모) B가 있다. 두 수를 나누었을 때, 소숫점 아래 N번째 자리수를 구하려고 한다. 예를 들어, A=3, B=4, N=1이라면, A÷B=0.75 이므로 출력 값은 7이 된다.

www.acmicpc.net

백준 BOJ 1312번 소수 문제 사진

 

접근 방법 - 수학적 사고력을 필요로 하는 연산 문제

백준의 1312번 문제는 수학적 사고력을 이용하여 해결해야 하는 응용문제이다.

해당 문제는, 두 숫자에 대하여 나눗셈을 수행했을 시 특정 소수점에 위치하는 숫자를 구하여 출력해야 하는 문제이다.

필자는 처음엔, 특정 소수점에 있는 숫자를 일의 자리로 꺼내는 것만 생각하였다가 오버플로우가 발생하였었다.

이 과정을 해결하면서, 필요한 숫자만 골라내기 위해 아래의 코드처럼 작성하였고 이렇게 문제를 해결할 수 있었다.

그만큼 사고가 필요한 문제이니 자신의 힘으로 풀어보고 싶다면 코드 설명만 확인한 뒤 스스로 다시 한번 풀어보길 바란다.

해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 피제수 2개(a, b)와 특정 소수점의 위치(n)를 입력받는다.

 

2) n+1의 크기만큼, 반복문을 실행하여 아래의 연산을 취한다.

- cnt를 선언하여, 여기에 a를 b로 나눈 몫을 저장한다. (마지막에 연산한 결과만 남게 됨)

- a를 b로 나누었을 때의 나머지를, a에 저장하여 갱신한다.

- 저장된 a에 10을 곱한다.

>> 일반적으로, 수기로 작성할 때 사용되는 나눗셈의 원리를 이용하였습니다.
(ex) 25 7 5 입력된 경우
1. cnt에는 3이 저장됨 / a에는 25%7인 4에서 10을 곱한 40이 저장됨 (일의 자리 구함)
2. cnt에는 5가 저장됨 / a에는 40%7인 5에서 10을 곱한 50이 저장됨 (소수점 1번째 자릿수 구함)
3. cnt에는 7이 저장됨 / a에는 50%7인 1에서 10을 곱한 10이 저장됨 (소수점 2번째 자릿수 구함)
4. cnt에는 1이 저장됨 / a에는 10%7인 3에서 10을 곱한 30이 저장됨 (소수점 3번째 자릿수 구함)
5. cnt에는 4가 저장됨 / a에는 30%7인 2에서 10을 곱한 20이 저장됨 (소수점 4번째 자릿수 구함)
6. cnt에는 2가 저장됨 / a에는 20%7인 6에서 10을 곱한 60이 저장됨 (소수점 5번째 자릿수 구함)
>> 정답으로 2 출력 (마지막 cnt 출력)

 

3) 위의 연산이 완료되었다면, 최종적으로 저장된 cnt를 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 1312번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int a, b, n;
	cin >> a >> b >> n;

	int cnt;
	for (int i = 0; i <= n; i++) {
		cnt = a / b;
		a %= b;
		a *= 10;
	}
	cout << cnt << endl;
}

 

제출 결과

백준 BOJ 1312번 소수 문제 C++ 제출 결과

(2022.09.29 백준 1312번 문제 제출 결과)

반응형