力扣算法数学类—分数到小数

目录

分数到小数

题解:

代码:


分数到小数

166. 分数到小数 - 力扣(LeetCode)

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个 。

对于所有给定的输入,保证 答案字符串的长度小于 104 。

示例 1:

输入:numerator = 1, denominator = 2
输出:"0.5"
示例 2:

输入:numerator = 2, denominator = 1
输出:"2"
示例 3:

输入:numerator = 4, denominator = 333
输出:"0.(012)"
 

提示:

-231 <= numerator, denominator <= 231 - 1
denominator != 0

题解:

首先,需要将分子、分母转化为long,因为分子可能 ∗10导致溢出int的数据范围。

问题拆解:

  • 计算小数的正负号。
  • 计算小数的小数点前的整数。
  • 计算小数的小数点后的有限小数 或者 无限循环小数。

★计算小数的小数点后小数:

  • 模拟除法运算,即分子∗10然后 分子/ 分母。注意整除的情况,即没有小数点后的数字。
  • 有限小数,会出现 分子/分母 整除的情况。
  • 无限循环小数,会出现 分子/分母 的余数等于之前的一步的分子。

代码:

class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        long a=numerator;
        long b=denominator;
        if(a==0) return "0";
        //存储结果
        StringBuilder sb=new StringBuilder();
        //判断正负号
        if((a<0&&b>0)||(a>0&&b<0)){
            
            sb.append("-");
            a= a<0 ? -a : a;
            b=b<0 ? -b : b;
        } 
        
        long res1=a/b;
        //判断有没有小数部分
        long temp=a%b;
        if(temp==0){
            sb.append(res1);
            return sb.toString();
        }else{
            sb.append(res1);
            sb.append('.');
            long res2[]=new long[10001];
            long temp2[]=new long[10001];
            int i=0;
            int k=-1;
            while(temp!=0){
                temp*=10;
                res2[i]=temp/b;
                temp2[i]=temp%b;
                temp=temp2[i];                
                
                if(temp!=0&&i!=0){
                    for(int j=0;j<i;j++){
                    //相等说明找到了循环体位置,标注一下
                   if(res2[j]==res2[i]&&temp2[j]==temp){
                       k=j;
                       break;
                   }   
                }
                }
                if(k!=-1){
                    break;
                }
                i++;
            }
            if(k==-1){
               for(int j=0;j<i;j++) {
                   sb.append(res2[j]);
               }
            }else{
               for(int j=0;j<i;j++) {
                   if(j==k){
                        sb.append('('); 
                   }
                   sb.append(res2[j]);
               }
               sb.append(')');
            }
            return sb.toString();
            
        }
        
    }
}

猜你喜欢

转载自blog.csdn.net/qq_62799214/article/details/131753220
今日推荐