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

一.引入

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

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

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

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

 

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

转载于:https://www.cnblogs.com/hxsyl/p/3330481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值