拼多多2019校园招聘 正式批笔试 2018.8.30 第三题 循环小数

本人化学硕士,最近准备转行找工作,华为、网易一面就凉了,没想到自己这么菜鸡。接下来校招开始,一大波笔试来袭,不会的边记边总结。

话不多说,看题目:

3-1.png

3-2.png

3-3.png

public class Main{
	 public static int [] startIndexAndCircleLength(int a,int b) {
		 int [] arr=new int [2];
		 StringBuilder sb=new StringBuilder();
		 int zheng=a/b;                                                   //整数部分
		 int startIndex=0;
		 int CircleLength=0;
		 if(a%b!=0) {
			 sb.append(zheng).append(".");
			 int yu=a%b;                                                 //余数部分
			 Map <Integer,Integer> map =new HashMap<>();
			 while(yu!=0) {
				 int temp=yu*10/b;
				 if(map.containsKey(temp)) {
					 startIndex=map.get(temp)-sb.lastIndexOf(".");
					 CircleLength=sb.length()-sb.lastIndexOf(temp+"");
					 break;
				 }
				 map.put(temp, sb.length()-1);
				 sb.append(temp);
				 yu=yu*10%b; 
			 }
		 }
		 if(sb.toString().contains(".")&&CircleLength==0) {
			 startIndex= sb.length()-sb.lastIndexOf(".")-1;
		 }
		 arr[0]=startIndex;
		 arr[1]=CircleLength;
		 return arr;
	 }

 public static void main(String[] args) {
	    	Scanner in=new Scanner(System.in);
	    	int a=in.nextInt();
	    	int b=in.nextInt();
	    	int arr []=startIndexAndCircleLength(a,b);
	    	System.out.println(arr[0]+" "+arr[1]);
	    	
		}
}
	

两个 整数相除还比较容易,循环小数的最小循环节肯定不会有相同的数字,循环开始的数字肯定也是小数后第一次出现的数字,所以可以用一个map来存放,当第二次出现时,就说明肯定是循环小数啦。

下面是考虑符号位的代码,并且循环体用()括起来:

 public static String fractionToDecimal(int numerator, int denominator) {
	        if(numerator == 0)
	            return "0";
	        if(denominator == 0)
	            return "";
	        long num = Math.abs((long) numerator),den = Math.abs((long)denominator);
	        Map<Long,Integer> map = new HashMap<>();
	        StringBuilder sb = new StringBuilder();
	        if((numerator < 0) ^ (denominator < 0))
	            sb.append('-');
	        long rem = num % den,quo = num / den;
	        sb.append(quo);
	        if(rem != 0)
	            sb.append('.');
	        rem *= 10;
	        while(rem != 0) {
	            Integer idx = map.get(rem);
	            if(idx != null) {
	                sb.insert(idx,"(").append(')');
	                break;
	            }
	            else {
	                map.put(rem,sb.length());
	                sb.append(rem / den);
	                rem = (rem % den) * 10;
	                
	            }
	        }
	            
	        return sb.toString();
	    }

 


版权声明:本文为sherlockholmeto原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。