面试:输出循环小数的循环节

一.引入

        偶然在网上看见的,手痒了,就试了试,哈哈。。。。。。。做出来了,实际就是模拟。

        下面的来自维基百科:循环小数是从小数部分的某一位起,一个数字或几个数字,依次不断地重复出现的小数。

        循环小数即为有理数的小数表示形式,例:

              1

         定理:一个分母为N的循环小数的循环节位数最多不超过N-1位。

       (1) 化为分数的方法

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

                       2
         (2)利用长除法可以将分数(有理数)转化为循环小数。
                         3

                         4

二.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;
	}

}

 

三.感悟
        在函数外部先做数据处理化成统一格式方便多了。。。。。。。

posted @ 2013-09-20 15:46  加拿大小哥哥  阅读(5465)  评论(2编辑  收藏  举报