一. 题目链接:
Repeating Decimals UVA - 202
二.题目大意:
给出两个整数a、b(0 ≤ a ≤ 3000,1 ≤ b ≤ 3000),求 a / b.
表达形式:1. 如果小数点后面 ≤ 50 位,那么输出 整数部分.小数不循环部分(循环小数).
2. 如果小数点后面 >50 位,那么输出 整数部分.小数不循环部分(循环小数...).
(小数点后只输出前 50 位)
三.分析:
模拟除法运算,第一次碰到,详见代码.
四.代码实现:
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define PI acos(-1.0)
#define ll long long int
using namespace std;
const int M = 3010;
int Dec[M];
int Rem[M];
int main()
{
int a, b;
while(~scanf("%d %d", &a, &b))
{
printf("%d/%d = %d.", a, b, a / b);///整数部分
int cnt = 0;
int i;
while(1)
{
a = a % b * 10;
Rem[cnt] = a;///记录余数
for(i = 0; i < cnt; ++i)
if(Rem[i] == a)///余数重复出现
break;
if(i != cnt)
break;
Dec[cnt++] = a / b;///记录小数部分
}
for(int j = 0; j < i; ++j)
printf("%d", Dec[j]);///不循环小数部分
printf("(");
if(cnt <= 50)
{
for(int j = i; j < cnt; ++j)
printf("%d", Dec[j]);
printf(")");
}
else
{
for(int j = i; j < 50; ++j)
printf("%d", Dec[j]);
printf("...)");
}
printf("\n %d = number of digits in repeating cycle\n\n", cnt - i);///循环长度
}
return 0;
}