C言語関係掲示板

過去ログ

No.462.循環小数を循環節がわかるように表示

[戻る] [ホームページ]
No.3339

プログラムを教えてください
投稿者---momo(2002/11/05 18:49:16)


問:分数を小数にすると、有限小数にならないならば必ず循環小数になる。分母と分子の値を入力し、小数に直すプログラムを作成せよ。循環節が分かるように工夫せよ。

学校で上記のC言語の課題を出題されたのですが、どうしても分かりません。どなたか、プログラムを教えてください。
ヒントやプログラムの方向性でも構いません。よろしくお願いします。

No.3354

Re:プログラムを教えてください
投稿者---かずま(2002/11/07 01:13:08)


> 問:分数を小数にすると、有限小数にならないならば必ず循環小数になる。
> 分母と分子の値を入力し、小数に直すプログラムを作成せよ。
> 循環節が分かるように工夫せよ。
#include <stdio.h>
#include <stdlib.h>

void fraction(int a, int b)
{
    int i, j, *col, *rem;

    col = malloc((b + b + 1) * sizeof(int));
    if (col == NULL) puts("out of memory"), exit(1);
    rem = col + b;
    printf("%8d.", a / b);
    rem[0] = col[0] = i = 0;
    for (;;) {
        rem[++i] = a %= b;
        j = col[a];
        if (j >= 0 && j < i && rem[j] == a) break;
        col[a] = i;
        a *= 10;
        printf("%d", a / b);
    }
    if (a == 0)
        printf("\n");
    else if (col[a] == --i)
        printf("\n%*c\n", 9 + col[a], '^');
    else
        printf("\n%*c%*c\n", 9 + col[a], '^', i - col[a], '^');
    free(col);
}

int main()
{
    int a, b;

    while (printf("a/b ? "), scanf("%d%*c%d", &a, &b) == 2)
        fraction(a, b);
    return 0;
}
未初期化変数を参照して、しかも正しく動く変なプログラムです。