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