UVA-202 Repeating Decimals(模拟)_循环节

 

 

UVA-202 Repeating Decimals(模拟)_循环小数_02

 

首先可以确定,一个分数,是肯定能化成循环小数的。

这里把小数所有位数枚举出来显然不可行,因为并不知道这小数到底有多少位,所以不能将其枚举再找周期;

我们想一想,如果是手算,遇到循环节的时候一定是出现了前面出现过的余数,所以可以通过这种方式找循环节。

↑有时候纯暴力无法解决的模拟题想想如果是人自己该怎么算↑

这道模拟题不同阶段之间的问题主要表现在一定要分清楚当前位的商对应的是当前位的余数!!!一定不能混淆!!!

 

1 #include "bits/stdc++.h"
2 using namespace std;
3 const int MAX=3005;
4 int n,m,dig;
5 int a[MAX],vis[MAX];
6 int main(){
7 freopen ("repeat.in","r",stdin);
8 freopen ("repeat.out","w",stdout);
9 int i,j,p,q,nn,mm;bool flag;
10 while (~scanf("%d%d",&n,&m)){
11 memset(a,0,sizeof(a));
12 memset(vis,-1,sizeof(vis));
13 nn=n,mm=m;dig=n/m;n=n%m;vis[n]=0;
14 while (1){
15 n*=10;
16 a[++a[0]]=n/m;
17 if (vis[n%m]!=-1) break;
18 vis[n%m]=a[0];
19 n%=m;
20 }
21 printf("%d/%d = %d.",nn,mm,dig);
22 for (i=1;i<=vis[n%m];i++) printf("%d",a[i]);
23 printf("(");
24 if (a[0]<=50)
25 for (;i<=a[0];i++) printf("%d",a[i]);
26 else{
27 for (;i<=50;i++) printf("%d",a[i]);
28 printf("...");
29 }
30 printf(")\n %d = number of digits in repeating cycle\n\n",a[0]-vis[n%m]);
31 }
32 return 0;
33