π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_μˆ˜ν•™&κ΅¬ν˜„

[Baekjoon/λ°±μ€€][1008][C/C++] A/B

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 1. 16.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

λ‹€μ‹œ λŒμ•„μ˜¨ 기초 문제 ν’€μ΄μ‹œκ°„. λ‹€λ§Œ, 이번 λ¬Έμ œλŠ” λ‹¨μˆœ λ‚˜λˆ„κΈ° λ¬Έμ œκ°€ μ•„λ‹Œ 'μ‹€μˆ˜ μžλ£Œν˜•'κ³Ό 'λΆ€λ™μ†Œμˆ˜μ '에 λŒ€ν•œ 이해λ₯Ό λ°”νƒ•μœΌλ‘œ ν•˜λŠ” λ¬Έμ œμ΄λ‹€. ν‘œν˜„μ΄ μ–΄λ €μ›Œ 보여도, μ‹€μˆ˜μ— λŒ€ν•œ λ””ν…ŒμΌν•œ μ΄ν•΄κΉŒμ§€ μš”κ΅¬ν•˜λŠ” λ¬Έμ œλŠ” μ•„λ‹ˆλΌμ„œ, 기본적인 κ°œλ…λ§Œ μž‘ν˜€μžˆλ‹€λ©΄ μΆ©λΆ„νžˆ μ‰½κ²Œ ν’€ 수 μžˆλ‹€. (사싀 μ–Όλ§ˆμ „κΉŒμ§€ μ»΄ν™œ1κΈ‰ κ³΅λΆ€ν•œλ‹€κ³  VBAλ¬Έλ²•λ§Œ κ³΅λΆ€ν•˜λ‹€κ°€, λ‹€μ‹œ Cμ–Έμ–΄λ‘œ λ„˜μ–΄μ˜€λ‹ˆ 문법이 ν—·κ°ˆλ¦°λ‹€.πŸ˜‚)

1. 문제

 

1008번: A/B

두 μ •μˆ˜ A와 Bλ₯Ό μž…λ ₯받은 λ‹€μŒ, A/Bλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

www.acmicpc.net

[문제]

두 μ •μˆ˜ A와 Bλ₯Ό μž…λ ₯받은 λ‹€μŒ, A/Bλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

[μž…λ ₯]

첫째 쀄에 A와 Bκ°€ 주어진닀. (0 < A, B < 10)

[좜λ ₯]

첫째 쀄에 A/Bλ₯Ό 좜λ ₯ν•œλ‹€. μ‹€μ œ μ •λ‹΅κ³Ό 좜λ ₯κ°’μ˜ μ ˆλŒ€μ˜€μ°¨ λ˜λŠ” μƒλŒ€μ˜€μ°¨κ°€ 10-9 μ΄ν•˜μ΄λ©΄ 정닡이닀.

[예제 μž…λ ₯ 1]

1 3

[예제 좜λ ₯ 1]

0.33333333333333333333333333333333

10-9 μ΄ν•˜μ˜ 였차λ₯Ό ν—ˆμš©ν•œλ‹€λŠ” 말은 κΌ­ μ†Œμˆ˜ 9번째 μžλ¦¬κΉŒμ§€λ§Œ 좜λ ₯ν•˜λΌλŠ” 뜻이 μ•„λ‹ˆλ‹€.

[예제 μž…λ ₯ 2]

4 5

[예제 좜λ ₯ 2]

0.8

2. 풀이

이 문제λ₯Ό ν’€κΈ° μœ„ν•΄ μ•Œκ³  μžˆμ–΄μ•Ό ν•  2가지 κ°œλ…μ΄ μ‘΄μž¬ν•œλ‹€.

 

1. μ‹€μˆ˜ μžλ£Œν˜•μ€ μ˜€μ°¨κ°€ λ°œμƒν•œλ‹€.(뢀동 μ†Œμˆ˜μ  방식)

2. C/C++μ—μ„œ 각 μžλ£Œν˜•μ— λ”°λ₯Έ μ†Œμˆ˜μ  μ΄ν•˜ 정밀도가 μ–΄λ–»κ²Œ λ˜λŠ”κ°€?

 

[1. μ‹€μˆ˜ μžλ£Œν˜•μ€ μ˜€μ°¨κ°€ λ°œμƒν•œλ‹€. (뢀동 μ†Œμˆ˜μ  방식)]

μ‹€μˆ˜ μžλ£Œν˜•μ— μ˜€μ°¨κ°€ λ°œμƒν•˜λŠ” μ΄μœ λŠ”, μ •μˆ˜μ™€λŠ” λ‹€λ₯Έ μ‹€μˆ˜μ˜ ν‘œν˜„λ°©μ‹ λ•Œλ¬Έμ΄λ‹€.

이에 λŒ€ν•œ 원둠적인 μ΄μ•ΌκΈ°λŠ” λ‹€λ₯Έ ν¬μŠ€νŒ…μ— λ‹€λ£° μ˜ˆμ •μ΄κΈ°μ—, μš°μ„ μ€ λ‹€λ₯Έ λΆ„μ˜ 글을 μ°Έκ³ ν•˜μž.

https://ahnjg.tistory.com/m/16

 

μ»΄ν“¨ν„°μ—μ„œ μ‹€μˆ˜μ˜ ν‘œν˜„ (Fixed Point, Floating Point, Single Precision, Double Precision)

컴퓨터가 수λ₯Ό ν‘œν˜„ν•˜λŠ” 방식 μ‚¬λžŒλ“€μ€ 일반적으둜 0~9의 쑰합을 가진 10μ§„μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ†Œν†΅ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ»΄ν“¨ν„°λŠ” 0κ³Ό 1의 μ‘°ν•©μœΌλ‘œ 이루어진 λΉ„νŠΈλ§Œμ„ μ €μž₯ν•˜κ³  μ—°μ‚°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 따라

ahnjg.tistory.com

μœ„ 글을 μ½μ—ˆλ‹€λ©΄, 뢀동 μ†Œμˆ˜μ  λ°©μ‹μœΌλ‘œ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν• λ•Œ μ˜€μ°¨κ°€ λ°œμƒν•˜λŠ” 이유λ₯Ό μ•Œκ²Œ 될 것이닀.

 

[2. C/C++μ—μ„œ 각 μžλ£Œν˜•μ— λ”°λ₯Έ μ†Œμˆ˜μ  μ΄ν•˜ 정밀도가 μ–΄λ–»κ²Œ λ˜λŠ”κ°€?]

κ·Έλ ‡λ‹€λ©΄ float, double, long double μžλ£Œν˜•μ— λ”°λ₯Έ μ†Œμˆ˜μ  μ΄ν•˜ 정밀도가 μ–΄λ–»κ²Œ 될까?

'μ—΄ν˜ˆC'μ—μ„œλŠ” μ†Œμˆ˜μ  μ΄ν•˜ 정밀도λ₯Ό λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•œλ‹€.

float 6자리
double 15자리
long double 18자리

 

λ”°λΌμ„œ, μœ„ 문제의 경우 μ ˆλŒ€μ˜€μ°¨ λ˜λŠ” μƒλŒ€μ˜€μ°¨κ°€  $10^{-9}$이어야 ν•˜λ―€λ‘œ double ν˜Ήμ€ long double의 μžλ£Œν˜•μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

μΆ”κ°€μ μœΌλ‘œ, μ†Œμˆ˜μ  μ΄ν•˜ 9μžλ¦¬κΉŒμ§€μ˜ μƒλŒ€ μ˜€μ°¨κ°€ μΈμ •λ˜λ―€λ‘œ printfλ₯Ό ν†΅ν•œ μ„œμ‹ ν‘œκΈ° μ‹œ, μ„œμ‹λ¬Έμžκ°€ μ†Œμˆ˜μ  9자리 이상을 λ‚˜νƒ€λ‚Ό 수 있게 ν‘œκΈ°ν•˜μ—¬μ•Ό ν•œλ‹€. '%.9f', '%.10f ', '%.11f', ... μ€ κ°€λŠ₯ν•˜μ§€λ§Œ, '%.8f', '%.7f', '%.6f', ... 의 경우 μ˜€λ‹΅ μ²˜λ¦¬λœλ‹€.

 

<3μ€„μš”μ•½>

1. double μžλ£Œν˜• 이용. (long double은 κ°€λŠ₯, float은 λΆˆκ°€λŠ₯)

2. μ„œμ‹λ¬Έμž %.9f μ‚¬μš©. (μ†Œμˆ˜μ  9자리 μ΄μƒλ§Œ ν‘œκΈ° κ°€λŠ₯ν•˜λ©΄ λœλ‹€.)

3. λ‚˜λˆ—μ…ˆ 진행 μ‹œ (double)을 ν‘œκΈ°ν•˜μ—¬ λͺ…μ‹œμ  ν˜•λ³€ν™˜μ„ μ§„ν–‰ν•˜μž. (이거 μ•ˆ ν•˜λ©΄ 바보...)

3. μ½”λ“œ

#pragma warning(disable:4996) //visual studio scanf 였λ₯˜ 방지.
#include <stdio.h>

int main(int argc, char* argv[]) {

	int a = 0, b = 0;
	scanf("%d %d", &a,&b);
	printf("%.9f", (double)a/b);	//double μžλ£Œν˜•μœΌλ‘œ λͺ…μ‹œμ  ν˜•λ³€ν™˜ 진행.
	return 0;

}

 

728x90
λ°˜μ‘ν˜•