2016年5月10日 星期二

UVA 275 Expanding Fractions

 

這個題目要求你把兩個整數的商展開來。你應該清楚,有很多整數的商展開來以後會變成循環小數。你必須找出這些循環的部份。給你整數的商,你要印出它的小數展開式,當小數部份已經沒有了或是即將開始第一次重覆之前就要停止輸出。如果有循環,你要說明循環節有幾位數。

輸入Input

會有多個輸入案例,每案例由同一行的兩個整數所組成。第一個整數代表分數的分子,第二則代表分母。本題目的分子永遠小於分母,分母永遠小於 1000。當分子分母同時為 0時,輸入結束。

輸出Output

相對於每輸入案例,要輸出該分數的小數展開式,第一個字元是小數點。如果可以完全展開,印出完整的小數。如果是無限小數,就印到 (但不包含第一個重覆出現的循環節之前。
例如:4/11 = .3636363636...,應該印出 .36(注意,要找出最小的循環節。在此案例中 3636  363636 都是循環節,但是最短的循節是 36)
由於有些展開式會很長,請分行顯示,除了最後一行可以比較短外,每行必須剛好 50 字元,包含開始的小數點。
在最後一行的小數展開式之後,緊接著要說「This expansion terminates.  (完全展開)  或「The last n digits repeat forever.」,其中 n 代表循環節的位數。
所有案例的輸出之後都要有一行空行 (包括最後一個案例
實用小提示: 循環節的長度不會大於分母。

範例輸入Sample Input

3 7
345 800
112 990
53 122
0 0

範例輸出Sample Output

.428571
The last 6 digits repeat forever.
 
.43125
This expansion terminates.
 
.113
The last 2 digits repeat forever.
 
.4344262295081967213114754098360655737704918032786
885245901639
The last 60 digits repeat forever.
 
翻譯:郭兆平

http://luckycat.kshs.kh.edu.tw/homework/q275.htm

import java.util.Scanner;

public class UVA_275 {

 public static void main(String[] args) {
  Scanner sc=new Scanner(System.in);
  int n,m;
  while((n=sc.nextInt())!=0 && (m=sc.nextInt())!=0){
   int[] math=new int[1001];
   System.out.print(".");
   math[n]=1;
   if(n==m || n==0){
    System.out.println("This expansion terminates.");
    continue;
   }
   int time=1,judge=0;
   while(true){
    if(time%50==0)
     System.out.println();
    System.out.print(n*10/m);
    n=n*10%m;
    time++;
    if(n==0){
     judge=1;
     break;
    }
    if(math[n]>0){
     break;
    }
    math[n]=time;
   }
   if(judge==1){
    System.out.println("\nThis expansion terminates.");
   }else{
    System.out.println("\nThe last 60 digits repeat forever.");
   }
   
  }

 }

}

沒有留言:

張貼留言