算法竞赛入门经典:UVA202 Repeating Decimals(Java版)

题意:输入整数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();
     }
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值