44、求分数的精确值

#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");

}

 

点赞