一.引入
偶然在網上看見的,手癢了,就試了試,哈哈。。。。。。。做出來了,實際就是模拟。
下面的來自維基百科:循環小數是從小數部分的某一位起,一個數字或幾個數字,依次不斷地重複出現的小數。
循環小數即為有理數的小數表示形式,例:
定理:一個分母為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;
}
}
三.感悟
在函數外部先做資料處理化成統一格式友善多了。。。。。。。