本人化学硕士,最近准备转行找工作,华为、网易一面就凉了,没想到自己这么菜鸡。接下来校招开始,一大波笔试来袭,不会的边记边总结。
话不多说,看题目:
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版权协议,转载请附上原文出处链接和本声明。