본문 바로가기

IT전공관련

코드업 함수 문제

코드업 1602(절댓값)

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
double fabs(double a) {
    if (a < 0)
        return -a;
    else
        return a;
}
int main() {
    double b;
    scanf("%lf"&b);
    printf("%.10g\n", fabs(b));
    return 0;
}
cs

설명 : 먼저 절댓값은 실수에서 +와 -기호를 

뺀 수(0부터의 거리)이기 때문에 음수이면 안됀다.

떄문에 위 함수 지정에서 a < 0으로 했을떄

앞에 - 를 붙여줘서 양수가 나오게 된다.

%g로 불필요한 0을 생략한다.

**사실 처음에는 밑에 처럼 짯는 데 VS에서는 잘되는데

코드업에서는 틀렸다고 뜨네요...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
 
double fabs(double a) {
    if (a < 0) {
        return printf("%.10g"-a);
    }
    else {
        return printf("%.10g", a);
    }
}
int main() {
    double num;
    scanf("%lf"&num);
    fabs(num);
    return 0;
}
cs


코드업 1610(서브 스트링)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
 
char *mysubstr(char *str, int start, int count) {
    int i;
    char num[1000= {0, };
    for (i = start; i < count + start; i++) {
        num[i] = str[i];
    }
    return &num[start];
}
int main() {
    char num[100] = {0, };
    int a, b;
    scanf("%s", num);
    scanf("%d %d"&a, &b);
    printf("%s", mysubstr(num, a, b));
    return 0;
}
cs

설명: 먼저 문자열을 집어넣을 num을 하나더 선언해 주고 반복문을 

이걸 사용하는 사람이 입력한값 start부터 start + count까지 더한다.

(여기서 더하는 이유는 예를 들자면 7자리 문자열을 입력하고 그 담에

 2부터 3을 입력했을때 2부터 5까지 출력해야하는데 

여기서 5는 start + count와 같다)

그다음에 배열안에 값을 반복문을 돌리고있는 i를 집어넘으로서 사용자가 입력한값을

하나 하나씩 출력한다.

*!)여기서 num으로 다시받아 return하는 이유는 str로 리턴하면 다시 str이 처음하고

똑같아 지기 때문이다


코드업 1615(셀프넘버) **(이건 주석으로 설명)**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
 
int a(int n) {
    int num = n;              // 1. 자기 자신을 더해주고(넣어주고)
    while (n) {               //n != 0까지 돌린다
        num += n % 10;        // 각 자리의 합을
        n /= 10;              // 구하는 식
    }
    return num;               // 자기 자신+각 자리의 합을 넣은 변수 리턴
}
int d(int n, int n1) {
    int i, go[5500= {0, }, go1 = 0;
    for (i = 1; i <= n1; i++) {    // 2. 효율적이게 5000까지 다하지않고, 사용자가
                                     // 범위의 끝으로 설정한 수까지 반복되게한다
        if (a(i))                    // a(i)를해서 나온 수가 제레네이터가
            go[a(i)] = 7;            //있는 수니까 그수 안에 의미있는
    }                                //0빼고 임의의 정수(레이어 7)를 배열에 넣어준다
    for (i = n; i <= n1; i++) {      // 3. 이제는 사용자가 입력한 범위만큼 반복하다
        if (!go[i])                  //만약 배열 안에 수중 0이 있다면
        go1 += i;                    //go1에 그 배열안의 값을 더해준다
    }                                // 셀프넘버가 아닌수는 7을 집어넣어줬기 때문!
    printf("%d",go1);                // 그리고 그 값(go1)을 출력한다
}
 
int main() {
    int a, b;                        //4. 변수선언
    scanf("%d %d"&a, &b);          // 2개 입력받기
    d(a, b);                         // 함수로 설정해놨던것 출력
    return 0;                        // 종료
}
cs


코드업 1620(자릿수의 합)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
 
int num(int a) {
    int num1 = 0, num2 = 0, num3 = 0;
        while (a) {
            num1 += a % 10;
            a = a / 10;
    }
        a = num1;
        while (a) {
            num2 += a % 10;
            a = a / 10;
        }
        a = num2;
        while (a) {
            num3 += a % 10;
            a = a / 10;
        }
        return num3;
    }
int main() {
    int go1;
    scanf("%d"&go1);
    printf("%d", num(go1));
    return 0;
}
cs

설명 : 일단 나는 입력받을 n의 값에 주목하였다

n은 (1 <= n <= 10,000,000)이기 때문에 

자릿수의 합을 구할떄 최대가 3번이다.

그래서 나는 자릿수를 구하는 while문을 3번 반복하였다

여기서 한번 반복을 할때마다 그 값을 a에 넣어줘서

밑에 있는 반복문은 위에서 구한 a의 값으로

while문을 실행하게 하였다.

코드업 1904(두 수사이에 홀수 출력하기)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int num(int a, int b)
{
    if (b >= a + 1){
        return 0;
    }
    else if (b % 2 == 1) {
        printf("%d ", b);
        num(a , b + 1);
    }
    else
         num(a , b + 1);
}
int main()
{
    int g, g1;
    scanf("%d %d"&g, &g1);
    num(g1, g);
    }
cs

설명 : 일단 사용자가 입력한 두수를 밑에서

코드를 짜기쉽게 둘이 바꿔준다음에

만약 3과 7을 입력했을때 3을 점점 증가시켜주면서

만약 3이 7까지 증가하면서 중간에 홀수가 있다면

바로 출력하고 없다면 그냥 값만 올려주는 형식을 취했다

그리고 값이 a를 초과했을경우 컴파일을 끝낸다.

!*(저 if구문은 b > a로 나타내도 된다. 알아보기 쉽게하기위해서

저렇게 작성하였다)

코드업 1920(2진수 변환)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
 
int jinsu(int num){
    if (num / 2 != 0){
        jinsu(num / 2);
    }
    printf("%d", num % 2);
}
int main() {
    int a;
    scanf("%d"&a);
    jinsu(a);
    return 0;
}
cs

설명 : (사실 프밍시간때 if문으로 살짝 푼문제다) 

이것은 컴퓨터일반때 배운지식으로 풀면되는 문제이다.

먼저 컴일 시간때 10진수를 2진수로 바꿀때

이러한 식으로 간단하게  풀었다

저코드는 바로 이식을 그대로 가져다가 대입한것인데,

일단if문으로 나눌수있을때 까지 나누고 (0, 1은 2로 나누면 0이 나온다.)

나눌수 있다면 그 나머지를 출력하는 식으로 코드를 짰다.

(그러다 보니 굉장히 간단해 졌다)


코드업 1928(우박수)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
void ub(int a) {
    if (a % 2 == 0) {
        printf("%d\n", a / 2);
        return ub(a / 2);
 
    }
    else if (a == 1) {
        return 1;
    }
    else {
        printf("%d\n"3 * a + 1);
        return ub(3 * a + 1);
    }
    }
int main() {
    int num;
    scanf("%d"&num);
    printf("%d\n", num);
    ub(num);
    return 0;
}
cs

설명 : 먼저 입력 받은 수가 1일때 컴파일을 1로 끝내는 구문을 만들고

그담에 홀수이면 3 X a + 1을 출력하고, 

3 X a + 1를 다시 ub에 보내준다. 그리고 만약 짝수라면

 a/2를 해서 값을 출력하고, 그다음에 다시 a/2값을 

다시 ub에 보내준다.


코드업 1953(삼각형 출력하기)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
 
int num(int a, int b, int c) {
    if (a == b) {
        return 0;
    }
    else if (c < b) {
        printf("*");
         num(a, b, c + 1);
    }
    else if(c == b){
        printf("\n");
         num(a, b + 1, c = -1);
    }
}
int main() {
    int a, b, c;
    b = 0;
    c = -1;
    scanf("%d"&a);
    num(a, b, c);
    return 0;
}
cs

일단 num에 int 형 변수 3개를 설정해놓고,

그다음에 메인부분에서b = 0, c= -1로 설정해 놓는다.

그리고 a == b가 종료 조건으로 만들고

c가 b보다 작을 때에는 별을 출력하게 해주었다.

그리고 c+1을 해주면서 c의 값을 늘려주었다.

그 다음에 만약 c와 b가 같아진다면 줄을 바꿔주고,

b를 하나 늘려주며 그와 동시에 c를 다시 -1로 초기화

시켜 주었다!!

컴퓨터 공학의 기초! C언어의 개요


'IT전공관련' 카테고리의 다른 글

개인 프로젝트  (0) 2017.05.17
C언어 관련ppt 보고서  (0) 2017.05.05
swap함수 구현하기  (0) 2017.04.06
포인터 보고서  (0) 2017.04.06
100제 풀기  (0) 2017.04.05