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

一.引入

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

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

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

951770e06756273e73f9f7a6d75c4822.png

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

(1) 化为分数的方法

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

530b03d6858784a872bfc09bd636317b.png

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

091631951db751868b46d2c8922c293b.png

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

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;

}

}

三.感悟

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值