1. 程式人生 > 實用技巧 >UVA-202 Repeating Decimals(模擬)

UVA-202 Repeating Decimals(模擬)

首先可以確定,一個分數,是肯定能化成迴圈小數的。

這裡把小數所有位數枚舉出來顯然不可行,因為並不知道這小數到底有多少位,所以不能將其列舉再找週期;

我們想一想,如果是手算,遇到迴圈節的時候一定是出現了前面出現過的餘數,所以可以通過這種方式找迴圈節。

↑有時候純暴力無法解決的模擬題想想如果是人自己該怎麼算↑

這道模擬題不同階段之間的問題主要表現在一定要分清楚當前位的商對應的是當前位的餘數!!!一定不能混淆!!!

 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 }