面试:输出循环小数的循环节
一.引入
偶然在网上看见的,手痒了,就试了试,哈哈。。。。。。。做出来了,实际就是模拟。
下面的来自维基百科:循环小数是从小数部分的某一位起,一个数字或几个数字,依次不断地重复出现的小数。
循环小数即为有理数的小数表示形式,例:
定理:一个分母为N的循环小数的循环节位数最多不超过N-1位。
(1) 化为分数的方法
我先想到用高中的等比数列的和求极限方式求取(a1/(1-q))。
二.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;
}
}
三.感悟
在函数外部先做数据处理化成统一格式方便多了。。。。。。。
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.