Experiment 3

1

#include<stdio.h>
char evaluate_grade(int point);
int main() {
    int input;
    char result;
    while (scanf("%d", &input) != EOF) {
        result = evaluate_grade(input);
        printf("点数:%d ", input);
        printf("評価:%c\n", result);
    }
    return 0;
}

char evaluate_grade(int point) {
    char grade;
    switch (point / 10) {
        case 10:
        case 9: grade = 'A'; break;
        case 8: grade = 'B'; break;
        case 7: grade = 'C'; break;
        case 6: grade = 'D'; break;
        default: grade = 'E';
    }
    return grade;
}

問題1:点数を評価コードに変換する関数。入力は整数型、出力は文字型

問題2:switch文にbreakがない場合、複数のケースが連続実行される。例:100点でABCDEすべてが表示される

2

#include<stdio.h>
int calculate_digit_sum(int value);
int main() {
    int num;
    int total = 0;
    while (printf("数値入力:"), scanf("%d", &num) != EOF) {
        total = calculate_digit_sum(num);
        printf("入力:%d 合計:%d\n\n", num, total);
    }
    return 0;
}

int calculate_digit_sum(int value) {
    int sum = 0;
    while (value != 0) {
        sum += value % 10;
        value /= 10;
    }
    return sum;
}

問題1:各桁の数字を合計する関数

問題2:数値が逆順に処理されるが、合計計算には影響しない

#include <stdio.h>
int quick_power(int base, int exponent); 
int main() {
    int x, n;
    int result;
    while (printf("基数と指数:"), scanf("%d%d", &x, &n) != EOF) {
        result = quick_power(x, n); 
        printf("結果:%d\n\n", result);
    }
    return 0;
}

int quick_power(int base, int exponent) {
    if (exponent == 0)
        return 1;
    else if (exponent % 2)
        return base * quick_power(base, exponent - 1);
    else {
        int temp = quick_power(base, exponent / 2);
        return temp * temp;
    }
}

問題1:高速べき乗計算の再帰実装

問題2:偶数指数の時二分探索のように計算量を減らす

4

#include<stdio.h>
int is_prime(int number)
{
    int i;
    if (number <= 1)
        return 0;
    for (i = 2; i*i <= number ; i++)
    {
        if (number % i == 0)
            return 0;
    }
    return 1;
}
int main()
{
    int i, count;
    count = 0;
    for (i = 2; i < 100; i++)
    {
        if (is_prime(i) && is_prime(i + 2))
        {
            printf("%d  %d\n", i, i + 2);
            count++;
        }
    }
    printf("双子素数:%d組\n", count);
    return 0;
}

5

#include<stdio.h>
int move_count = 0;
void hanoi_towers(unsigned int disks, char source, char auxiliary, char target);
int main()
{  
    unsigned int n;
    while (scanf("%u", &n) != EOF)
    {   
        hanoi_towers(n, 'A', 'B', 'C');
        printf("移動回数:%d\n", move_count);
        move_count = 0;
    }
    return 0;
}

void hanoi_towers(unsigned int disks, char source, char auxiliary, char target)
{
    if (disks == 1) {
        printf("%u:%c→%c\n", disks, source, target);
        move_count++;
    }
    else
    {
        hanoi_towers(disks - 1, source, target, auxiliary);
        printf("%u:%c→%c\n", disks, source, target);
        move_count++;
        hanoi_towers(disks - 1, auxiliary, source, target);
    }
}

6 繰り返し処理

#include <stdio.h>
int combination(int total, int select); // 関数宣言
int main() {
    int n, m;
    int result;
    while (scanf("%d%d", &n, &m) != EOF) {
        result = combination(n, m); // 関数呼び出し
        printf("n = %d, m = %d, C(n,m) = %d\n\n", n, m, result);
    }
    return 0;
}

int combination(int total, int select)
{
    int a, b, c, answer = 1;
    for (a = 1; a <= total; a++)
    {
        answer *= a;
    }
    for (b = 1; b <= select; b++)
    {
        answer /= b;
    }
    for (c = 1; c <= (total - select); c++)
    {
        answer /= c;
    }
    return answer;
}

int combination_recursive(int total, int select)
{
    if (select > total)
        return 0;
    if (select == 0)
        return 1;
    return combination_recursive(total - 1, select) + combination_recursive(total - 1, select - 1);
}
#include<stdio.h>
#include<stdlib.h>
void draw_character_pattern(int layers);
int main() {
    int n;
    printf("層数入力:");
    scanf("%d", &n);
    draw_character_pattern(n);
    return 0;
}

void draw_character_pattern(int layers) 
{
    int i, j, k,l;
    for (i = layers; i >= 1; i--)
    {
        printf("\n");
        int width = 2 * i - 1;
        for (l = 0; l < layers - i; l++)
        {
            printf("\t");
        }
        for (j = 1; j <= width; j++)
        {
            printf(" O \t");
        }
        printf("\n");
        for (l = 0; l < layers - i; l++)
        {
            printf("\t");
        }
        for (j = 1; j <= width; j++) 
        {
            printf("<H>\t");
        }
        printf("\n");
        for (l = 0; l < layers - i; l++)
        {
            printf("\t");
        }
        for (j = 1; j <= width; j++)
        {
            printf("I I\t");
        }
    }
}

タグ: C言語 アルゴリズム 再帰関数 数値計算 パターン生成

5月30日 15:49 投稿