新手的代码
思路:
求出小数的小数部分,需要一定的长度,可以将其保存在数组中
将数组分为最长 length/2 部分,一一进行比较判断是否是循环节并求出循环节长度
package edu.ecut;
public class ArrayTest {
public static void main(String[] args) {
int length = 1000;
int second = 6;
int first = 1;
ArrayTest obj = new ArrayTest();
int[] array = obj.getArray(first, second, length);
obj.print(array);
System.out.println(obj.getRepeatLength(array));
}
private int getRepeatLength(int[] array) {
int length = -1;
for (int i = 1; i < array.length / 2; i++) {
length = i;
if (isRepeat(array, length)) {
int[] repetend = getRight(array, length);
//判断循环节中的数字是否都一样
if (isOnlyOne(repetend)) {
return 1;
}
return length;
}
}
return length;
}
private boolean isOnlyOne(int[] repetend) {
for (int i = 0; i < repetend.length - 1; i++) {
int temp = repetend[i];
if(temp != repetend[i + 1]){
return false;
}
}
return true;
}
private boolean isRepeat(int[] array, int length) {
int[] source = getRight(array, length);
for (int i = 1; i < array.length / length; i++) {
int[] dest = getRight(array, length, array.length - 1 - i * length);
if (!compare(source, dest)) {
return false;
}
}
return true;
}
private boolean compare(int[] source, int[] dest) {
for (int i = 0; i < dest.length; i++) {
if (dest[i] != source[i]) {
return false;
}
}
return true;
}
private int[] getRight(int[] array, int length) {
int[] result = new int[length];
for (int i = 0; i < result.length; i++) {
result[i] = array[array.length - 1 - i];
}
return result;
}
private int[] getRight(int[] array, int length, int startIndex) {
int[] result = new int[length];
for (int i = 0; i < result.length; i++) {
result[i] = array[startIndex - i];
}
return result;
}
private void print(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
private int[] getArray(int first, int second, int length) {
int[] array = new int[length];
//将假分数化为真分数
while (first > second) {
first -= second;
}
//求两数相除的小数部分
for (int i = 0; i < array.length; i++) {
first *= 10;
array[i] = first / second;
first %= second;
}
return array;
}
}