以下のプログラムは互除法の剰余計算の回数を表示するものです。 ただし、回数を数える部分が抜けているので、そのままコンパイル実行すると、 剰余計算の回数:0 と表示されてしまいます。剰余計算の回数を正しく表示するように、 プログラムを修正し、コンパイル、実行してみて下さい。
ヒント1:printf(",理論値%.0f\n", ceil(log(n) / log((1 + sqrt(5)) / 2))); と書いてある行は理論的上限を表示しているので関係ありません。
ヒント2:どこかに「cnt++;」と書きます。
ヒント3:1カ所ではありません。
#include <stdio.h> #include <stdlib.h> #include <math.h> int gcd(int x, int y) { int r; int cnt = 0; int n; n = y; r = x % y; while (r > 0) { printf("x = %d, y = %d, r = %d\n", x, y, r); x = y; y = r; r = x % y; } printf("剰余計算の回数:%d", cnt); printf(",理論値%.0f\n", ceil(log(n) / log((1 + sqrt(5)) / 2))); return y; } int main(int argc, char *argv[]) { int a, b; if (argc <= 2) { printf("引数が足りません\n"); return 1; }; a = strtol(argv[1], NULL, 10); b = strtol(argv[2], NULL, 10); printf("gcd(%d, %d) = %d\n", a, b, gcd(a, b)); return 0; }
ダウンロード: gcd-ren1.c
次のプログラムはフィボナッチ数列を第n項まで表示するものです。ただし、for ループの中が 書かれていません。for ループの中にフィボナッチ数列を計算する部分を書いてください。
ヒント:c という変数が宣言されています。
上級向け:出来た人は、if 文をなくして、for ループだけでもっとスマートに書けないか、 考えてみましょう。
#include <stdio.h> #include <stdlib.h> void fib(int n) { int a = 1; int b = 1; int c; int i; printf("%d ", a); if (n == 1) { return; } printf("%d ", b); for (i = 3; i <= n; i++) { /* このあたりにに、フィボナッチ数列の次の値を計算する 処理を書きます */ printf("%d ", ); /* ここで計算した値を表示します */ } printf("\n"); } int main(int argc, char *argv[]) { int n; if (argc <= 1) { printf("引数が足りません\n%s 個数\n", argv[0]); return 1; }; n = strtol(argv[1], NULL, 10); fib(n); return 0; }
ダウンロード: fib-ren1.c