小数のプログラミング


1.有限小数
例えば3/8=0.375で、この小数の形式を印刷します.
// a >= 0, b > 0
void printDecimal(int a, int b){
    int cnt = 0;
    while (a > 0){
        if (cnt++ == 1) cout << ".";
        cout << a/b;                //     
        a = (a % b) * 10;
                                    // a % b == 0  ,a   b    
    }
    cout << endl;
}

2.無限(循環)小数
1/11=0.0909090909…、すなわち無限ループ小数が現れると、関数は無限に実行されます.しかし、問題は、2つの整数を除いて、1つが無限循環小数であるかどうかをどのように決定するか(無理数ではない)ということです.
実はハトの穴の原理を利用して得ることができて、a = (a % b) * 10.ここで、a%bの結果は、常に[0, b-1]の範囲内の整数値をとる.b+1回実行してもプログラムを終了できないと仮定すると,同じ結果が1回目から2回目までの数が無限ループのループ小数であると断定できる.
void printDecimal(int a, int b){
    int cnt = 0;
    while (a > 0){
        if (cnt++ == 0) cout << ".";
        cout << a/b ;
        a = (a % b) * 10;
        if (cnt == b+1)
            break;
    }
}