C언어/ 거듭제곱 pow의 문제점

리얼니트·2021년 9월 10일
0

1학년

목록 보기
15/24
post-thumbnail

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]);
}

좆같다... 나는 저 코드 짜다가 자꾸 막히는 게 있어서 밥을 몇끼를 먹었다.
나처럼 배열을 재배치하고 정수로 바꾸고 할 필요없이
그냥 바로 백의 자리끼리 비교하고 큰 쪽이 나오면 반복문에서 나와 큰 쪽의 배열의 역순을 한글자씩 출력해버린다.
백의자리가 같다면 그 뒤 연산을 하지 않고 바로 십의자리끼리 비교하는 걸로 넘어간다.
문자형끼리 비교하는 것을 포인터를 써서 어떻게 하는 것 같은데 아직 공부가 부족해서 저 부분은 이해가 안간다. 나중에 알게되면 내용을 추가 할 것.

profile
방구석에서 잘 살아요

0개의 댓글