https://www.acmicpc.net/problem/2908
이 문제를 풀다가 pow함수를 처음 쓰게 되었다.
math.h헤더를 사용한다.
pow(10.0, 2);
10.0의 2승을 계산하는 방식이다. double형으로 반환한다.
문제는 double형으로 반환하는데 있다.
100을 반환하는게 맞지만, 이상하게 gcc에 windows10 환경에서는 자꾸 99라는 값이 나오더라
#include <stdio.h>
#include <math.h>
int main(void){
int sum=0, disc=2;
for(int i=0; i<3; i++){
sum+=(int)pow(10.0,disc);
printf("10의 %d승 : %d\n",disc,(int)pow(10.0,disc));
disc--;
}
printf("%d",sum);
return 0;
}
결과
10의 2승 : 99
10의 1승 : 10
10의 0승 : 1
110
다른 사람 블로그 글을 읽어보니까 MinGW때문에 문제가 발생하는 거라고 한다.
그럼 어떻게 해야하느냐,
그냥 반올림 한 값을 반환하기 위해
round()로 감싸주면 된다.
#include <stdio.h>
#include <math.h>
int main(void){
int sum=0, disc=2;
for(int i=0; i<3; i++){
sum+=round(pow(10.0,disc));
printf("10의 %d승 : %d\n",disc,round(pow(10.0,disc)));
disc--;
}
printf("%d",sum);
return 0;
}
결과
10의 2승 : 100
10의 1승 : 10
10의 0승 : 1
111
참고로 맨 위에 백준 문제는 이렇게 풀었다.
#include <stdio.h>
#include <math.h>
int main(void){
char arr1[4], arr2[4], temp;
int sum1=0, sum2=0, disc=2;
scanf("%s %s", arr1, arr2);
temp=arr1[0];
arr1[0]=arr1[2];
arr1[2]=temp;
temp=arr2[0];
arr2[0]=arr2[2];
arr2[2]=temp;
for(int i=0; i<3; i++){
sum1+=((int)arr1[i]-48)*round(pow(10.0,disc));
sum2+=((int)arr2[i]-48)*round(pow(10.0,disc));
disc--;
}
if(sum1>sum2) printf("%d\n",sum1);
if(sum2>sum1) printf("%d\n",sum2);
return 0;
}
문자열을 배열로 받고 역순으로 재배치하기 위해 temp라는 변수를 사용했다.
두번째 값은 놔두고, 첫번째 값과 세번째 값을 교환했다.
각각의 문자를 3자리 정수로 표현하기 위해서 거듭제곱을 활용해보았다.
(참고 : https://m.blog.naver.com/hirit808/221516374367)
...근데 어떤 사람은 이런식으로 풀었더라..
char a[4],b[4],*r,c=3;
main(){
scanf("%s%s",a,b);
while(c--)
if(a[c]!=b[c]){
r=(a[c]>b[c])?a:b;
break;
}
c=3;while(c--)putchar(r[c]);
}
좆같다... 나는 저 코드 짜다가 자꾸 막히는 게 있어서 밥을 몇끼를 먹었다.
나처럼 배열을 재배치하고 정수로 바꾸고 할 필요없이
그냥 바로 백의 자리끼리 비교하고 큰 쪽이 나오면 반복문에서 나와 큰 쪽의 배열의 역순을 한글자씩 출력해버린다.
백의자리가 같다면 그 뒤 연산을 하지 않고 바로 십의자리끼리 비교하는 걸로 넘어간다.
문자형끼리 비교하는 것을 포인터를 써서 어떻게 하는 것 같은데 아직 공부가 부족해서 저 부분은 이해가 안간다. 나중에 알게되면 내용을 추가 할 것.