zoukankan      html  css  js  c++  java
  • 面试:输出循环小数的循环节

    转自:http://www.cnblogs.com/hxsyl/p/3330481.html

    一.引入

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

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

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

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

     

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

    作者:张朋飞
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
  • 相关阅读:
    体温上报系统
    Android开发概述和开发工具
    体温上报系统
    CSS padding(填充)
    CSS margin外边距实例
    CSS margin(外边距)
    CSS轮廓outline
    函数对象与闭包
    作业,3.19名称空间作用域
    名称空间/作用域
  • 原文地址:https://www.cnblogs.com/foreverme/p/3330528.html
Copyright © 2011-2022 走看看