题意:输入整数a和b(0<=a,b<=3000),输出a/b的小数表示以及循环节长度。如果循环节超过50位,就在第50位后打省略号(...)
思路:取出整数部分过后,再用余数计算小数点后的各位。每次将余数先乘以10,取出小数及其余数,循环用数组存储每一位余数,枚举看余数是否重复出现,标记循环节出现的起始和结束位置,相减得到循环节的长度。
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int a=in.nextInt();
int b=in.nextInt();
int z=a/b;
int[] n=new int[10050];//小数点后数字
int[] y=new int[10050];//余数数组
y[0]=a%b;
Boolean f=false;
int yu,l=0,r=0;
for(int i=0;;i++){//枚举看余数是否重复出现
yu=y[i]*10;
n[i]=yu/b;
y[i+1]=yu%b;
for(int j=0;j<=i;j++){
if(y[i+1]==y[j]){
f=true;
l=j;//标记循环开始位置
r=i+1;//标记循环结束位置
}
}
if(f) break;
}
System.out.print(a+"/"+b+" = ");
System.out.print(z+".");
for(int k=0;k<l;k++)//按位能够整除的情况下,这里的k!=l,否则会出现多余的‘0’
System.out.print(n[k]);
System.out.print("(");
if (r-l<=50){
for (int k = l; k < r; k++)
System.out.print(n[k]);
}
else
{
for (int k = l; k < l + 50; k++)
System.out.print(n[k]);
System.out.print("...");
}
System.out.println(")");
System.out.print(" ");
System.out.println(r - l +" = " + "number of digits in repeating cycle" );
System.out.println();
}
in.close();
}
}