小数のプログラミング
2063 ワード
1.有限小数
例えば3/8=0.375で、この小数の形式を印刷します.
2.無限(循環)小数
1/11=0.0909090909…、すなわち無限ループ小数が現れると、関数は無限に実行されます.しかし、問題は、2つの整数を除いて、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;
}
}