[TIL]20210623
C언어
혼자 삽질하며 깨달은 것.
밑의 내용은 상당히 난잡하다. 결론만 보자.
.
.
코드업 1085번을 풀면서 분명 양수 값들만 넣었는데 음수가 나오는 경우를 보았다.
#include <stdio.h>
int main(void) {
int h, b, c, s;
scanf("%d %d %d %d", &h, &b, &c, &s);
printf("%.1f MB",(float)(h*b*c*s)/(8*1024*1024) );
}
에서 48000 32 5 300 를 입력하면 -237.3 MB이 나온다.
#include <stdio.h>
int main(void) {
long long int h, b, c, s;
scanf("%lld %lld %lld %lld", &h, &b, &c, &s);
printf("%.1lld MB",(long long int)(h*b*c*s)/(8*1024*1024) );
}
값이 너무 커서 그럴까 싶어 출력단에서 lld를 사용했는데, 44100 16 2 10 입력시 1MB가 나왔다.
순간적으로 큰 값을 담는 것만 생각하고 실수형인 것을 고려하지 못했기 때문이다.
어떻게 풀어야 할지 모르겠어서 질문탭에 나와 같은 오류가 있는 질문의 답변을 참고했다.
#include <stdio.h>
int main(void) {
long long int h, b, c, s;
scanf("%lld %lld %lld %lld", &h, &b, &c, &s);
printf("%.1f MB",(float)(h*b*c*s)/(8*1024*1024) );
}
int 대신 long long int 를 이용해 값을 받고, printf 단에서 (float)을 사용하면 해결 된다고 하였다.
결론적으로
printf("%.1f MB",(float)(h*b*c*s)/(8*1024*1024) );
에서
(float)(h*b*c*s)/(8*1024*1024)
를 구조적으로 봤을 때,(h*b*c*s)
의 값을(float)
을 통해 먼저 실수값으로 계산 한 후,(8*1024*1024)
으로 나누어 실수 값을 유지한다.
(float)((h*b*c*s)/(8*1024*1024))
이런 식으로 뒤의 두항을 먼저 계산해주면 정수값으로 이미 계산된 것을 float형으로 변환해주는 것밖에 되지못한다.
최소공배수를 알고리즘으로 구현.
2 3 4의 최소공배수를 구하는 것을 알고리즘으로 구현하면 어떻게 될까?
2일에 한번 출석하는 경우와 3일, 4일에 한번씩 출석하는 경우를 0(출석)과 1(안함)로 표현한다면 위의 그림처럼 된다. 12일 일때 모두 출석하게 된다.
while(day % a!= 0 || day % b != 0 || day %c != 0) day++;
while문을 반복할때마다 day가 1씩 더해지도록 코드를 구성하면 조건은 나머지가 0으로 떨어질 때이다. ||
사이에 한개만 1이라도 while문이 실행됨으로 모두 0이 될때 비로소 빠져나가게 된다.
Author And Source
이 문제에 관하여([TIL]20210623), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kid_chang/TIL20210623저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)