【leetcode】Fraction to Recurring Decimal Java

哎呦,这个程序真是快调死我了,各种问题,小白成长的路上艰难险阻不断啊。。。

先来说说我的思路吧:

思路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 "";
                    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值