백준 알고리즘 1008번 문제입니다 (참고 - https://www.acmicpc.net/problem/1008 )


C 코드 ) 

#include <stdio.h>

int main() {

double A,B;

scanf("%lf %lf", &A, &B);

printf("%.9lf\n", A/B);


return 0;

}

아주 간단하다고 생각할 수 있지만, 의외로 중요한 문제라고 할 수 있습니다.

(오답)

#include <stdio.h>

int main() {

double A,B;

scanf("%f %f", &A, &B);

printf("%.9f\n", A/B);

return 0;

}


위 차이는, scanf에서의 포맷문자가 f인지 lf인지의 차이입니다.

포맷문자가 f이고 파라미터의 크기가 4이면 float로 처리하고, 

파라미터의 크기가 8이면 double로 처리하게 됩니다.

scanf는 입력을 받아야하므로 모든 파라미터를 포인터로 받게 되는데,

포인터는 주소값 4Byte만 전달될 뿐 해당 포인터가 가리키는 자료형이 무엇인가는 전달되지 않습니다.

즉, scanf가 전달받는 포인터는 void타입 포인터로 보면 됩니다.

그러므로 float과 double을 f와 lf로 구분해주어야 하는데, 문제에서는 소수점 9자리 이상 출력이었으므로 double을 사용해야 하는 문제입니다.

따라서 f로 하면 해당 문제에서 오답으로 판정되고, lf로 해주어야 올바른 답으로 향할 수 있다고 볼 수 있습니다.

더하여, 사용자가 만든 함수도 파라미터 전달 시 타입정보는 전달되지 않습니다.

받을 수 있는 타입이 처음부터 고정되어 있을 뿐이고, scanf처럼 타입이 가변형인 경우는 타입정보를 명시해 주는 수단으로써 포맷정보를 이용하게 되는 것입니다.


++)Java

public class algo1008 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println((double)sc.nextInt() / sc.nextInt());

}

}




WRITTEN BY
SiriusJ

,