此题为算法入门经典的3-8
这题输入格式为第二行前面三个空格,然后进行两个换行。
思路主要是通过两个数组进行模拟两者的运算过程,一个数组保存商,一个数组保存余数,自己进行手算模拟几次就可以想到,如果有循环小数的话,他的余数会与前面的余数相等,一旦出现余数相等,说明出现了循环体,就可以进行标记和break了,还有一点就是要注意,第一个例子的3.040不是无穷循环小数,在计算小数点后的4的时候,他的余数为0,和4后面的0的余数是一样的,所以要增加一个条件,就是不仅这两者的余数要相同,而且商也要一样,这样就可以了。循环一共两个,每计算一次新的余数和商时,就要和前面的数组进行比较一次,看看是否有相同的余数。这里也要注意初始化数组,否则可能问题,比如前面前30个被赋值,而现在这个只有20个被赋值,不初始化的话,20-30就没有被重新覆盖,出现错误。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main()
{
int shang[3000];
int yu[3000];
int point1 = 0;
int point2 = 0;
int m, n;
while(scanf("%d %d", &m, &n) != EOF)
{
int m1 = m;int n1 = n;
memset(shang, 0, sizeof(int) * 3000);
memset(yu, 0, sizeof(int) * 3000);
shang[0] = m / n;
yu[0] = m % n;
m = yu[0] * 10;
for(int i = 1; i < 3000; ++i)
{
bool flat = false;
shang[i] = m / n;
yu[i] = m % n;
int ys = yu[i];
int ss = shang[i];
m = yu[i] * 10;
for(int j = 1;j < i; ++j)
{
if(ys == yu[j] && ss == shang[j])
{
point1 = j;
point2 = i;
//cout << point1 << " " << point2 << endl;
flat = true;
break;
}
}
if(flat)
{
break;
}
}
cout << m1 << '/' << n1 << " = " <<shang[0] << '.';
for(int i = 1; i < point1; ++i)
{
cout << shang[i];
}
cout << '(';
if(point2 - point1 > 50)
{
for(int i = point1; i < point1 + 50; ++i)
{
cout << shang[i];
}
cout << "...";
}
else
{
for(int i = point1; i < point2; ++i)
{
cout << shang[i];
}
}
cout << ')'<< endl;
cout << " " << point2 - point1 << " = number of digits in repeating cycle" << endl <<endl;
}
return 0;
}