C言語入門 まとめ 解答例

Last-modified: 2021-12-08 (水) 17:49:28
 

難易度 ☆☆☆☆

課題0: 足し算

 #include <stdio.h>

 int main(){
    int a, b;

    scanf("%d %d", &a, &b);

    printf("%d\n", a + b);

    return 0;
 }

課題1: 切り捨て

 #include <stdio.h>

 int main(){
    int a;

    scanf("%d", &a);

    printf("%d\n", a / 1000 * 1000);

    return 0;
 }

課題2: 切り上げ

 #include <stdio.h>

 int main(){
    int a;

    scanf("%d", &a);

    printf("%d\n", (a + 999) / 1000 * 1000);

    return 0;
 }

課題3: 四捨五入

 #include <stdio.h>

 int main(){
    int a;

    scanf("%d", &a);

    printf("%d\n", (a + 500) / 1000 * 1000);

    return 0;
 }

課題4: 秒と分

 #include <stdio.h>

 int main(){
    int a;

    scanf("%d", &a);

    printf("%d:%d\n", a / 60, a % 60);

    return 0;
 }

課題5: 1次方程式

 #include <stdio.h>

 int main(){
    int a, b;

    scanf("%d %d", &a, &b);

    printf("%.2f\n", -b / (double)a);

    return 0;
 }

難易度 ★☆☆☆

課題10: 絶対値

 #include <stdio.h>

 int main(){
    double a;

    scanf("%lf", &a);

    if(a < 0){
        printf("%.2f\n", -a);
    }

    else {
        printf("%.2f\n", a);
    }

    return 0;
 }

課題11: お釣り

 #include <stdio.h>

 int main(){
    int m;

    scanf("%d", &m);

    if(m / 10000 > 0){
        printf("10000 %d\n", m / 10000);
        m %= 10000;
    }

    if(m / 5000 > 0){
        printf("5000 %d\n", m / 5000);
        m %= 5000;
    }

    if(m / 1000 > 0){
        printf("1000 %d\n", m / 1000);
        m %= 1000;
    }

    if(m / 500 > 0){
        printf("500 %d\n", m / 500);
        m %= 500;
    }

    if(m / 100 > 0){
        printf("100 %d\n", m / 100);
        m %= 100;
    }

    if(m / 50 > 0){
        printf("50 %d\n", m / 50);
        m %= 50;
    }

    if(m / 10 > 0){
        printf("10 %d\n", m / 10);
        m %= 10;
    }

    if(m / 5 > 0){
        printf("5 %d\n", m / 5);
        m %= 5;
    }

    if(m > 0){
        printf("1 %d\n", m);
    }

    return 0;
 }
 

別解

 #include <stdio.h>

 int main(){
    int m, i;
    int c[] = { 10000, 5000, 1000, 500, 100, 50, 10, 5, 1 };

    scanf("%d", &m);

    for(i = 0; i < 9; ++i){
        if(m / c[i] > 0){
            printf("%d %d\n", c[i], m / c[i]);
            m %= c[i];
        }
    }

    return 0;
 }

課題12: 日数

 #include <stdio.h>

 int main(){
    int y, m;

    scanf("%d %d", &y, &m);

    switch(m){
        case 1:
            printf("31\n");
            break;

        case 2:
            if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0){
                printf("29\n");
            }

            else {
                printf("28\n");
            }

            break;

        case 3:
            printf("31\n");
            break;

        case 4:
            printf("30\n");
            break;

        case 5:
            printf("31\n");
            break;

        case 6:
            printf("30\n");
            break;

        case 7:
        case 8:
            printf("31\n");
            break;

        case 9:
            printf("30\n");
            break;

        case 10:
            printf("31\n");
            break;

        case 11:
            printf("30\n");
            break;

        case 12:
            printf("31\n");
            break;
    }

    return 0;
 }

難易度 ★★☆☆

課題20: 倍数

 #include <stdio.h>

 int main(){
    int a, m;
    int i, s = 0;

    scanf("%d %d", &a, &m);

    for(i = a; i <= m; i += a){
        s += i;
    }

    printf("%d\n", s);

    return 0;
 }

課題21: 最小値と最大値

 #include <stdio.h>

 int main(){
    int n, x, i;
    int min, max;

    scanf("%d", &n);

    scanf("%d", &min);
    max = min;

    for(i = 0; i < n - 1; ++i){
        scanf("%d", &x);

        if(x > max){
            max = x;
        }

        if(x < min){
            min = x;
        }
    }

    printf("%d %d\n", min, max);

    return 0;
 }

課題22: 素数判定

 #include <stdio.h>

 int main(){
    int x, i;

    scanf("%d", &x);

    for(i = 2; i < x; ++i){
        if(x % i == 0){
            break;
        }
    }

    if(i == x){
        printf("prime number\n");
    }

    else {
        printf("not prime number\n");
    }

    return 0;
 }

課題23: フィボナッチ数

 #include <stdio.h>

 int main(){
    int n, i;
    int f1 = 1, f2 = 1, t;

    scanf("%d", &n);

    for(i = 2; i < n; ++i){
        t  = f1 + f2;
        f1 = f2;
        f2 = t;
    }

    printf("%d\n", f2);

    return 0;
 }

課題24: 最大公約数

 #include <stdio.h>

 int main(){
    int a, b, t;

    scanf("%d %d", &a, &b);

    if(a < b){
        t = a;
        a = b;
        b = t;
    }

    // ユークリッドの互除法
    while(b != 0){
        t = a;
        a = b;
        b = t % b;
    }

    printf("%d\n", a);

    return 0;
 }

課題25: 2進数

 #include <stdio.h>

 int main(){
    int n, d, i;

    scanf("%d", &n);

    // 先に 2^15 を求める
    d = 2;

    for(i = 0; i < 14; ++i){
        d *= 2;
    }

    for(i = 0; i < 16; ++i){
        printf("%d", n / d);

        n %= d;
        d /= 2;
    }

    printf("\n");

    return 0;
 }
 

別解

 #include <stdio.h>

 int main(){
    int n, i;

    scanf("%d", &n);

    for(i = 0; i < 16; ++i){
        printf("%d", (n >> (15 - i)) & 1);
    }

    printf("\n");

    return 0;
 }

難易度 ★★★☆

課題30: 配列

 #include <stdio.h>

 int main(){
    int i, n, x;
    int f[10];

    for(i = 1; i < 10; ++i){
        f[i] = 0;
    }

    scanf("%d", &n);

    for(i = 0; i < n; ++i){
        scanf("%d", &x);
        f[x] = 1;
    }

    for(i = 1; i < 10; ++i){
        if(f[i] == 0){
            printf("%d\n", i);
        }
    }

    return 0;
 }

課題31: アルファベット

#include

int main(){
    int i, min;
    char s[11];

    scanf("%s", s);

    // 大文字を小文字に変換
    for(i = 0; s[i] != '\0'; ++i){
        if('A' <= s[i] && 'Z' >= s[i]){
            s[i] += 'a' - 'A';
        }
    }

    min = s[0];

    for(i = 1; s[i] != '\0'; ++i){
        if(min > s[i]){
            min = s[i];
        }
    }

    printf("%c\n", min);

    return 0;
}

課題32: 辞書順

#include
#include

int main(){
    char s[3][4];
    char t[4];
    int i;

    for(i = 0; i < 3; ++i){
        scanf("%s", s[i]);
    }

    if(strcmp(s[0], s[1]) > 0){
        strcpy(t,    s[0]);
        strcpy(s[0], s[1]);
        strcpy(s[1], t);
    }

    if(strcmp(s[1], s[2]) > 0){
        strcpy(t,    s[1]);
        strcpy(s[1], s[2]);
        strcpy(s[2], t);
    }

    if(strcmp(s[0], s[1]) > 0){
        strcpy(t,    s[0]);
        strcpy(s[0], s[1]);
        strcpy(s[1], t);
    }

    printf("%s%s%s\n", s[0], s[1], s[2]);

    return 0;
}

課題33: 連想配列

#include
#include

typedef struct {
    char key[11];
    int val;
} Node;

int main(){
    char cmd[6], key[11];
    Node map[10];
    int n, v;
    int i, j;

    for(i = 0; i < 10; ++i){
        map[i].key[0] = '\0';
    }

    scanf("%d", &n);

    for(i = 0; i < n; ++i){
        scanf("%s", cmd);
        scanf("%s", key);

        if(strcmp(cmd, "store") == 0){
            scanf("%d", &v);
        }

        for(j = 0; j < 10; ++j){
            if(strcmp(map[j].key, key) == 0){
                if(strcmp(cmd, "fetch") == 0){
                    printf("%d\n", map[j].val);
                }

                else {
                    map[j].val = v;
                }

                break;
            }
        }

        if(j == 10){
            for(j = 0; j < 10; ++j){
                if(map[j].key[0] == '\0'){
                    strcpy(map[j].key, key);
                    map[j].val = v;

                    break;
                }
            }
        }
    }

    return 0;
}

難易度 ★★★★

課題40: 素数

#include
#include

#define

char prime[MAX];

// エラトステネスの篩
void eratosthenes(){
    int i, j;
    int max = sqrt(MAX) + 2;

    for(i = 2; i < max; ++i){
        if(prime[i] == 0){
            for(j = i + i; j < MAX; j += i){
                prime[j] = 1;
            }
        }
    }
}

int main(){
    int i, n;
    int count = 0;

    eratosthenes();

    scanf("%d", &n);

    for(i = 2; i < MAX; ++i){
        if(prime[i] == 0){
            ++count;

            if(count == n){
                printf("%d\n", i);
                break;
            }
        }
    }

    return 0;
}

課題41: ソート

#include

// 選択ソート
void select_sort(int *p, int n){
    int i, j;
    int min_idx, temp;

    for(i = 0; i < n - 1; ++i){
        min_idx = i;

        for(j = i + 1; j < n; ++j){
            if(p[min_idx] > p[j]){
                min_idx = j;
            }
        }

        temp       = p[i];
        p[i]       = p[min_idx];
        p[min_idx] = temp;
    }
}

int main(){
    int i, n;
    int x[10];

    scanf("%d", &n);

    for(i = 0; i < n; ++i){
        scanf("%d", &x[i]);
    }

    select_sort(x, n);

    for(i = 0; i < n; ++i){
        if(i > 0){
            printf(" ");
        }

        printf("%d", x[i]);
    }

    printf("\n");

    return 0;
}