#include<iostream>
using namespace std;
/*
1、求分数的精确值?
问题描述:精确计算两个100之间的整数相除。
如果是有限小数,直接输出。
如果是无限循环,则输出循环的起始和结束位置。
解题思路:1.利用一个数组 quotient[]存放商的数组。
2、然后将余数乘以10,然后计算商的下一位。重复操作。
3、当余数某次为 0 的时候,则表示的是一个有限不循环小数。
4、如何判断是为无限循环小数。通过判断某次计算出现的余数,与前面的某个余数相同。从该余数第一次出现之后求得各位数,就是小数的循环节。
所以需要开辟一个 remainder[] 数组。
*/
int main(){
int m,n;
cin >> m >> n;
int quotient[101] = {0}; //存放除法商的数组
int remainder[101] = {0};//存放余数的数组 下标是为余数,数组的值为余数对应商的位数。
cout << m << "/" << n << "=0.";
for (int i = 1; i <= 100; i++) //i 表示商的位数
{
remainder[m] = i; //第一个余数为 m m:为除的余数。remainder[m] 为余数对应商的位数。
m *= 10;
quotient[i] = m / n; //求商
m = m%n; //求余数
if (m == 0){ //如果余数为 0
for (int j = 1; j<=i; j++){ //输出所以的商。
cout << quotient[j];
}
break;
}
if (remainder[m] != 0){ //如果余数对应的位在以前出现过。
for (int j = 1; j <= i; j++){ //输出所以的商。
cout << quotient[j] ;
}
cout << "\n 是无限循环小数,并从小数点后," << remainder[m] << "位"
<< "到" << i << "位" << endl;
break;
}
}
system("pause");
}