天天看點

面試:輸出循環小數的循環節

一.引入

        偶然在網上看見的,手癢了,就試了試,哈哈。。。。。。。做出來了,實際就是模拟。

        下面的來自維基百科:循環小數是從小數部分的某一位起,一個數字或幾個數字,依次不斷地重複出現的小數。

        循環小數即為有理數的小數表示形式,例:

面試:輸出循環小數的循環節

         定理:一個分母為N的循環小數的循環節位數最多不超過N-1位。

       (1) 化為分數的方法

              我先想到用高中的等比數列的和求極限方式求取(a1/(1-q))。

面試:輸出循環小數的循環節
         (2)利用長除法可以将分數(有理數)轉化為循環小數。
面試:輸出循環小數的循環節
面試:輸出循環小數的循環節
二.Java實作

import java.util.Arrays;      
public class Xiaoshuo {      
//使用char類型可以省記憶體也可以直接存儲小數點      
static char[] ch = new char[20];      
public static void main(String[] args) {      
// TODO Auto-generated method stub      
Arrays.fill(ch,'#');      
int a = 5;      
int b = 4;      
int index = 0;      
//在函數外部做處理友善多了      
if(a>=b) {      
if(a%b==0) {      
System.out.println(a/b+".0");      
return ;      
}      
System.out.print(a/b);      
ch[0] = '.';      
index = 1;      
a = a%b;      
}else {      
ch[0] = '0';      
ch[1] = '.';      
index = 2;      
}      
solve(index,a,b);      
}      
private static void solve(int index, int a, int b) {      
// TODO Auto-generated method stub      
//判斷餘數(你也可以叫商,好好看除法過程)是否出現過      
int from = -1;      
int to = -1;      
while(from==-1) {      
a *= 10;      
//必須加上48      
ch[index++] = (char)(a/b + 48);      
//不能再找到自身,是以需要第二個參數      
from = tell((char)(a/b+48),index-2);      
a = a%b;      
}      
to = index -2;      
for(int i=0; i<from; i++) {      
System.out.print(ch[i]);      
}      
System.out.print("{");      
for(int i=from; i<=to; i++) {      
System.out.print(ch[i]);      
}      
System.out.println("}");      
}      
private static int tell(char mod, int xiabiao) {      
// TODO Auto-generated method stub      
//先找到小數點後一位      
char c = ch[0];      
//index必須從0開始,因為有可能第一個就是小數點      
int index = 0;      
while(c!='.') {      
index++;      
c = ch[index];      
}      
//index是小數點的位置,是以從下一位開始      
index++;      
//采用while(mod1=‘#’)循環不行,這樣是最好的,既有下标,又到非法字元處結束(前提是數組比較大,填充了非法字元)      
for(int i=index; i<=xiabiao; i++) {      
if(mod==ch[i])      
return i;      
}      
return -1;      
}      
}      

三.感悟

        在函數外部先做資料處理化成統一格式友善多了。。。。。。。