C언어:3일차 (함수~

이미리·2021년 8월 14일
0

boj_Algorithm

목록 보기
4/25

요새 스터디하느라 백준 문제풀기를 소홀히 했다..
주말에라도 열심히 해야지


1065번 한수

#include <stdio.h>

int main() {
    int m,n,o;//첫째자리 두번째자리 세번째자리수
    int k = 99;
    int a[1001] ;
    for (int i = 1; i < 100; i++) {
        a[i] = 1;
    } // 99까지의 배열 만들기.
    for (int j = 111; j < 1000; j++) {
        o = j % 10;
        n = (j / 10) % 10;
        m = (j / 100) % 10;
        if ((o - n) == (n - m)) {
            a[j] = 1;
        }
    }// 한수의 배열을 만듦. --> 한수라면 자리수가 1이 되도록함.

    int num, result;
    scanf("%d", &num);
    if (num <= 99) {
        result = num;
    }
    else if (num<=110){
        result = 99;
    }
    else {
        result = 99;
        for (int h = 111; h <= num; h++) {
            if (a[h] == 1) {
                result++;
            }
        }
    }
    printf("%d", result);
    return 0;
}

예제로 나와있는 것에서는 문제점이 발견되지 않는다. 그런데 계속 틀렸습니다가 뜨니... 일단 질문게시판에 반례를 찾아달라고 올려놓았으나 나로써는 반ㄹㅖ를 찾기가 힘들다.. ㅠㅠ


11720번 숫자의 합

#include <stdio.h>

int main() {
    int num,t;
    int result = 0;
    int many;

    scanf_s("%d", &many);
    scanf_s("%d", &num);
    while (num != 0) {
        t = num % 10;
        num /= 10;
        result += t;
    }
    printf("%d", result);
    return 0;
}

간단한 숫자의 합이지만 25자리의 수가 들어와버리면 막히고 만다.
일반적인 정수자료형에 담기는 너무 크기 때문이다. 그렇다면.. 롱롱..?

롱롱으로 고쳐서 해보았으나 여전히 똑같은 결과가 나온다..

답은 아스키코드를 이용한 문자열끼리의 연산에 있었다.

#include <stdio.h>

int main(void) {

    int n, sum = 0;

    scanf("%d", &n);
    char num[n];
    scanf("%s", num); //%c 문자 %s 문자열
    for (int i = 0; i < n; i++) sum += num[i] - '0';
    //문자열끼리의 사칙연산이다. 문자열 0 == 48, 문자열 1 ==49, 문자열 2 ==50이다.
    //따라서 문자열 숫자 - 문자열 0 을 하게 되면 본래의 정수가 나오게 된다!!!!!
    printf("%d", sum);
}

예를 들어
문자열 "1"-"0" ==> 아스키코드로 변환했을 때 49-48로 1이 나오게 되는 것이다.
대박!

0개의 댓글

관련 채용 정보