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.09090909…,也即无限循环小数,此时函数将无限次执行下去。可问题在于,两个整数相除,如何确定一个是否为一个无限循环小数呢(不可能为无理数)?
其实利用鸽洞原理便可得到,a = (a % b) * 10
。其中 a%b
的结果总是取 [0, b-1]
范围内的整数值。假设执行了 b+1 次还没能终止程序,那么就能断定出,从相同结果第一次出现到第二次出现为止的数就是无限循环的循环小数。
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;
}
}