プログラミング問題と解説
問題1: 再帰関数の呼び出し回数
#include <stdio.h>
int count = 0;
int fibonacci(int num) {
count++;
if (num == 0) return 1;
if (num == 1) return 2;
return fibonacci(num - 1) + fibonacci(num - 2);
}
int main() {
fibonacci(8);
printf("%d", count);
return 0;
}
実行結果: 67
問題2: do-whileループの挙動
int num = 1;
do {
printf("%2d\n", num++);
} while(num--);
実行結果: 無限ループ
問題3: インクリメント演算子の評価順序
int val1 = 1;
int val2;
val2 = val1++;
実行後の値: val1=2, val2=1
問題4: 複合代入演算子の計算
int x = 10;
int y = 20;
int z = 3;
z *= x + y;
最終的なzの値: 90
問題5: 変数のスコープ
#include <stdio.h>
int global_val = 1;
void test_func() {
int local_val = 2;
local_val += 1;
}
int main() {
test_func();
printf("%d\n", global_val);
return 0;
}
出力結果: 1
問題6: do-whileループの実行回数
int val_a = 0, val_c = 0;
do {
--val_c;
val_a = val_a - 1;
} while(val_a > 0);
実行後のval_cの値: -1
問題7: データ型と除算
double d1 = 2;
double d2 = d1 + 3/2;
実行後のd2の値: 3.000000
問題8: forループの実行回数
for(int i = 0, j = 0; (j = 123) && (i < 4); i++);
ループ実行回数: 4
問題9: ポインタ演算
int year = 1009;
int *ptr = &year;
yearを1010に増加できない式: *ptr++
問題10: ビット演算
int result = 11 | 10;
実行結果: 11
問題11: データ型の自動変換
char c; int i; float f; double d;
式 c*i+d-f の結果の型: double
最小公倍数の計算
#include <stdio.h>
int main() {
long long a, b;
scanf("%lld %lld", &a, &b);
long long i = 1;
while (i * a % b != 0) {
i++;
}
printf("%lld", i * a);
return 0;
}
文字列入力の方法
#include <stdio.h>
int main() {
char str[100] = {0};
int index = 0;
int ch;
while ((ch = getchar()) != '\n') {
str[index++] = ch;
}
printf("%s", str);
return 0;
}
文字列の単語逆順処理
#include <stdio.h>
#include <string.h>
void reverse_chars(char *left, char *right) {
while (left < right) {
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main() {
char text[100] = {0};
gets(text);
int length = strlen(text);
reverse_chars(text, text + length - 1);
char *current = text;
while (*current) {
char *start = current;
while (*current != ' ' && *current != '\0') {
current++;
}
char *end = current - 1;
reverse_chars(start, end);
if (*current == ' ') current++;
}
printf("%s", text);
return 0;
}