之前没有发现这是一本C语言编写得书,但本人还未学习过C语言,只能尝试用java实现书中的代码,在此记录学习这本书的历程。
本人新手菜鸟,能力有限,如果有误或者有改进的地方欢迎指出,谢谢\(▔▽▔)/。
题目:输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节的长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节的长度为21.
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int number1 = input.nextInt();
int number2 = input.nextInt();
int first = (number1%number2);
int []out = new int[2];
int wei = 0;
while(first != 0 && !isLoop(out,wei)){
first =first*10;
if(out.length == wei) {
out = isBig(out);
}
if(first/number2 > 0) {
out[wei++] = first/number2;
first = first%number2;
}else {//注意当为零时表示被除数以小于除数,需进一位
out[wei++] = 0;
}
}
System.out.print(number1/number2+"."+"(");
for(int i = 0;i < wei/2+wei%2;i++) {//输出,注意奇数时最后一个循环数的位置
System.out.print(out[i]);
}
System.out.println(")");
System.out.print("循环字节的长度为:"+(wei/2+wei%2));
}
//计算是否循环
public static boolean isLoop(int []out,int wei) {
int count = 0;
if(wei < 3) {
return false;
}
for(int i = 0;i < wei/2;i++) {
if(out[i] == out[i + wei/2 + wei%2]) {
count++;
}
}
return count == wei/2;
}
//扩大数组
public static int[] isBig(int []out) {
int[]outs = new int[out.length*2];
for(int i = 0;i < out.length;i++) {
outs[i] = out[i];
}
return outs;
}