题目描述
1/7 = 0.142857142…是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。
题目要求即是:给出一个数字的循环小数表示法。
输入描述
输入一行,两个整数。 每个整数范围均为:1~1000例 如,样例输入: 1,7
输出描述
输出两个整数做除法产生的小数或引起无线循环小数(循环节用方括号括起)。 例如,对应输出:
0.[142857]
参考代码
public static void main(String[] args) {
int m;
int num[];
int mod[];
int x, y;
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
x = in.nextInt();
y = in.nextInt();
num = new int[1001];
mod = new int[1001];
num[0] = x / y;//计算整数部分
m = x % y;
int flag = 0;//标志,0:尚未处理完,1:整除,2:循环小数
int len = 1;//记录除法中小数的位数
int circle=0;//记录循环节的起始位
while (flag==0) {
mod[m]=len;//用散列表记录小数位第len位是m
num[len]=m*10/y;//对应短除法的商
m=m*10%y;//对应短除法的余数
if(mod[m]!=0){//mod[m]不为0说明m这个数已经出现过,在小数部分的mod[m]位
flag=2;//说明循环节结束,不用再继续计算了
circle=m;//m是循环节开始的位置
}
if(m==0)//flag=1说明可以整除,不是循环小数
flag=1;
len++;
}
//输出部分,如果flag=2,是循环小数,需要输出循环节标志[]
System.out.print(num[0]+".");//输出整数部分
for (int i = 1; i < len; i++) {
if(flag==2&&mod[circle]==i)//循环节开始
System.out.print("[");
System.out.print(num[i]);
}
if(flag==2)//flag=2说明是循环小数,输出循环节结束
System.out.println("]");
System.out.println();
}