哎呦,这个程序真是快调死我了,各种问题,小白成长的路上艰难险阻不断啊。。。
先来说说我的思路吧:
思路1:就是肯定是循环小数比较难嘛,然后纯循环比较好解决,就是分母是9,99,999,9999.。。。以此类推,混循环小数就是90啊,900,9900之类的(9的个数是小数循环体的个数,0的个数是非循环体的小数位数),但是到1/19的时候就超了int的上限了,于是只能放弃。
思路二:就是利用除法的那个性质,看什么时候会有相同的余数,然后再处理一下下就好了。可是这个在int的上下界的除法真是困扰了我很久,int和long的转化啊,本来想用abs把负数转化成正数,可是负数的上限比正数大一个,所以只能用long,啊。。调了一天终于搞定了。
public class Solution {
public String fractionToDecimal(int numerator, int denominator){
String s="";
if (numerator%denominator==0) {
long num=(long)numerator/denominator;
s=s+num;
return s;
}
Map<Integer, Integer> m1 = new HashMap<Integer, Integer>();
int i=0;
int b=numerator;
String flag="";
long numerator1=0L;
if (numerator<0 && denominator>0) {
flag="-";
}
if (numerator>0 && denominator<0) {
flag="-";
}
int[] shang=new int[1000];
int zheng=Math.abs(numerator/denominator);
int zheng1=numerator/denominator;
numerator=numerator- zheng1*denominator;
numerator1=(long)numerator;
// denominator=Math.abs(denominator);
System.out.println(zheng+" "+ numerator+" "+ denominator);
s="";
int num=0;
while(true){
numerator1=(long)numerator*10;
shang[i]=(int)(numerator1/(long)denominator);
numerator1=numerator1- (long)(denominator* shang[i]);
numerator=(int)numerator1;
if (m1.containsValue(numerator)) {
m1.put(i,numerator);
break;
}
m1.put(i,numerator);
i++;
}
for (int j=0;j<=i ;j++ ) {
if (shang[j]<0) {
shang[j]=-shang[j];
}
s=s+shang[j];
}
int len=s.length();
if (s.charAt(len-1)=='0' && m1.get(i)==0) {
s=s.substring(0,len-1);
System.out.println(s);
String s1=flag+zheng+"."+s;
return s1;
}
Set<Integer> set = m1.keySet();
for (int j:set) {
// System.out.println(j);
if (m1.get(j)-m1.get(i)==0) { // it doesn't work when I input m1.get(j)==m1.get(i) why???
// System.out.println(j);
num=j;
break;
}
}
if (s.substring(num,num+1).equals(s.substring(len-1,len))) {
s="("+s.substring(0,len-1)+")";
String s1=flag+zheng+"."+s;
return s1;
}
if (!s.substring(num,num+1).equals(s.substring(len-1,len))) {
s=s.substring(0,num+1)+"("+s.substring(num+1,len)+")";
String s1=flag+zheng+"."+s;
System.out.println(m1);
return s1;
}
System.out.println(s);
return "";
}
}