判断循环小数(Java实现)

//输入格式
//a,b
//a、b为整数
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args)  {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String input = sc.next();
		String[] inputArr = input.split(",");
		int numerator = Integer.valueOf(inputArr[0]);
		int denominator = Integer.valueOf(inputArr[1]);
		double quotient = (double)numerator/(double)denominator;
		//如果是循环小数
		if(isRepeating(numerator, denominator))
		{
			//纯循环小数,eg:1/3,1/7
			if(isPureRepeating(numerator, denominator))
			{
				ArrayList<Integer> remainderStack = new ArrayList<Integer>();
				ArrayList<Integer> quotientStack = new ArrayList<Integer>();
				int index=0;
				remainderStack.add((numerator*10)%denominator);
				quotientStack.add((numerator*10)/denominator);
				while(true)
				{
					int back = remainderStack.get(index)*10;
					while(back<numerator)
					{
						back=back*10;
						//remainderStack.add(0);
						quotientStack.add(0);
					}
					if(remainderStack.indexOf(back%denominator)!=-1)
					{
						//quotientStack.add(back/denominator);
						//remainderStack.add(back%denominator);
						int back1 = remainderStack.get(index)*10;
						while(back1<numerator)
						{
							back1=back1*10;
							//remainderStack.add(0);
							quotientStack.add(0);
						}
						index=quotientStack.indexOf(back1/denominator);
						break;
					}
					else 
					{
						quotientStack.add(back/denominator);
						remainderStack.add(back%denominator);
					}
					index++;
					
				}
				
				System.out.print(remainderStack);
				System.out.print(quotientStack);
				System.out.println(quotientStack.get(index));
				
				System.out.print("0.");
				for(int i = 0;i<index;i++)
					System.out.print(quotientStack.get(i));
				System.out.print("[");
				for(int i = index;i<quotientStack.size();i++)
					System.out.print(quotientStack.get(i));
				System.out.print("]");
			}
			//混合循环小数,1/6,34/45
			else
			{
				ArrayList<Integer> remainderStack = new ArrayList<Integer>();
				ArrayList<Integer> quotientStack = new ArrayList<Integer>();
				int tenNum = numerator*10;
				int index = 0;
				int rindex = 0 ;
				while(tenNum<denominator)
				{
					remainderStack.add(0);
					quotientStack.add(0);
					index++;
					tenNum*=10;
				}
				remainderStack.add(tenNum%denominator);
				quotientStack.add(tenNum/denominator);
				while(true)
				{
					int tenR = remainderStack.get(index)*10;
					while(tenR<denominator)
					{
						remainderStack.add(0);
						quotientStack.add(0);
						index++;
						tenR*=10;
					}
					if(remainderStack.indexOf(tenR%denominator)!=-1)
					{
						index = remainderStack.indexOf(tenR%denominator);
						//特殊处理1/6的情况
						if(index==0)	
						{
							remainderStack.add(tenR%denominator);
							quotientStack.add(tenR/denominator);
							index=remainderStack.lastIndexOf(tenR%denominator);
						}
						break;
					}
					else
					{
						remainderStack.add(tenR%denominator);
						quotientStack.add(tenR/denominator);
						index++;
						//rindex++;
					}
				}
				
				System.out.print("0.");
				for(int i = 0;i<index;i++)
					System.out.print(quotientStack.get(i));
				System.out.print("[");
				for(int i = index;i<quotientStack.size();i++)
					System.out.print(quotientStack.get(i));
				System.out.print("]");
			}
		}
		//如果不是循环小数
		else
		{
			System.out.print(quotient);
		}
		
	}
	//判断numerator/denominatoe是否是循环小数
	public static Boolean isRepeating(int numerator,int denominator)
	{
		int simpleNum = 0;
		int simpleDen = 0;
		if(numerator<denominator)
		{
			for(int i = numerator;i>0;i--)
			{
				if(numerator%i==0&&denominator%i==0)
				{
					simpleNum = numerator/i;
					simpleDen = denominator/i;
					break;
				}
			}
		}
		else
		{
			for(int i = denominator;i>0;i--)
			{
				if(numerator%i==0&&denominator%i==0)
				{
					simpleNum = numerator/i;
					simpleDen = denominator/i;
					break;
				}
			}
		}
		//如果分数化简后分母除了2,5之外还有素因数,就是无限循环小数
		for(int i = 2;i<=simpleDen;i++)
		{
			if(simpleDen%i==0)
			{
				if(isPrime(i))
				{
					if(i!=2&&i!=5)	return true;
				}
			}
		}
		return false;
	}

	//判断是否是素数
	public static boolean isPrime(int n)
	{
		if(n==1||n==2||n==3)	return true;
		for(int i =2 ;i<n;i++)
		{
			if(n%i==0)	return false;
		}
		return true;
	}
	//判断是否是纯循环小数,其中numerator<denominator
	public static boolean isPureRepeating(int numerator,int denominator)
	{
		int simpleNum = 0;
		int simpleDen = 0;
		if(numerator<denominator)
		{
			for(int i = numerator;i>0;i--)
			{
				if(numerator%i==0&&denominator%i==0)
				{
					simpleNum = numerator/i;
					simpleDen = denominator/i;
					break;
				}
			}
		}
		else
		{
			for(int i = denominator;i>0;i--)
			{
				if(numerator%i==0&&denominator%i==0)
				{
					simpleNum = numerator/i;
					simpleDen = denominator/i;
					break;
				}
			}
		}
		//如果化简后的分母能分解成两个或两个以上素数的乘积,则是混合无限循环小数
		if(isResolveToTwoPrime(simpleDen))		return false;
		else return true;
	}
	//判断分母是否能分解成两个以上素数的乘积,如果是返回false,否则true
	public static  boolean isResolveToTwoPrime(int num)
    {
        int i;
        int count = 0;
        for (i = 2; i < num; i++)
        {     
            while (i != num)
            {
                if (num % i == 0)
                {
                	count++;
                    num /= i;
                }
                else
                    break;
            }
        }
        if(count>=1)		return true;
        else return false;
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值