📜  计算小数点后小数点后的位数

📅  最后修改于: 2021-04-27 21:54:04             🧑  作者: Mango

我们给了两个数字A和B。我们需要计算小数点后的位数。如果数字不合理,请打印“ INF”。
例子:

Input  : x = 5, y = 3
Output : INF
5/3 = 1.666....

Input :  x = 3, y = 6
Output : 1
3/6 = 0.5 

这个想法很简单,我们遵循学校划分,一一一一地跟踪余数。如果余数变为0,我们返回小数点后的位数计数。如果其余部分重复,则返回INF。

C++
// CPP program to count digits after dot when a
// number is divided by another.
#include 
using namespace std;
 
int count(int x, int y)
{
    int ans = 0;  // Initialize result
     
    unordered_map m;
     
    // calculating remainder
    while (x % y != 0) {
 
        x = x % y;
 
        ans++;
 
        // if this remainder appeared before then
        // the numbers are irrational and would not
        // converge to a solution the digits after
        // decimal will be infinite
        if (m.find(x) != m.end())
            return -1;
 
        m[x] = 1;
        x = x * 10;
    }
    return ans;
}
 
// Driver code
int main()
{
    int res = count(1, 2);
    (res == -1)? cout << "INF" : cout << res;
 
    cout << endl;
    res = count(5, 3);
    (res == -1)? cout << "INF" : cout << res;
 
    cout << endl;
    res = count(3, 5);
    (res == -1)? cout << "INF" : cout << res;
    return 0;
}


Java
// Java program to count digits after dot when a
// number is divided by another.
import java.util.*;
 
class GFG
{
 
static int count(int x, int y)
{
    int ans = 0; // Initialize result
     
    Map m = new HashMap<>();
     
    // calculating remainder
    while (x % y != 0)
    {
 
        x = x % y;
 
        ans++;
 
        // if this remainder appeared before then
        // the numbers are irrational and would not
        // converge to a solution the digits after
        // decimal will be infinite
        if (m.containsKey(x))
            return -1;
 
        m.put(x, 1);
        x = x * 10;
    }
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    int res = count(1, 2);
    if((res == -1))
        System.out.println("INF");
    else
        System.out.println(res);
 
    res = count(5, 3);
    if((res == -1))
        System.out.println("INF");
    else
        System.out.println(res);
     
    res = count(3, 5);
    if((res == -1))
        System.out.println("INF");
    else
        System.out.println(res);
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program to count digits after dot
# when a number is divided by another.
def count(x, y):
    ans = 0 # Initialize result
 
    m = dict()
 
    # calculating remainder
    while x % y != 0:
        x %= y
 
        ans += 1
 
        # if this remainder appeared before then
        # the numbers are irrational and would not
        # converge to a solution the digits after
        # decimal will be infinite
        if x in m:
            return -1
 
        m[x] = 1
        x *= 10
 
    return ans
 
# Driver Code
if __name__ == "__main__":
    res = count(1, 2)
 
    print("INF") if res == -1 else print(res)
 
    res = count(5, 3)
    print("INF") if res == -1 else print(res)
 
    res = count(3, 5)
    print("INF") if res == -1 else print(res)
 
# This code is contributed by
# sanjeev2552


C#
// C# program to count digits after dot when a
// number is divided by another.
using System;
using System.Collections.Generic;
     
class GFG
{
 
static int count(int x, int y)
{
    int ans = 0; // Initialize result
     
    Dictionary m = new Dictionary();
     
    // calculating remainder
    while (x % y != 0)
    {
 
        x = x % y;
 
        ans++;
 
        // if this remainder appeared before then
        // the numbers are irrational and would not
        // converge to a solution the digits after
        // decimal will be infinite
        if (m.ContainsKey(x))
            return -1;
 
        m.Add(x, 1);
        x = x * 10;
    }
    return ans;
}
 
// Driver code
public static void Main(String[] args)
{
    int res = count(1, 2);
    if((res == -1))
        Console.WriteLine("INF");
    else
        Console.WriteLine(res);
 
    res = count(5, 3);
    if((res == -1))
        Console.WriteLine("INF");
    else
        Console.WriteLine(res);
     
    res = count(3, 5);
    if((res == -1))
        Console.WriteLine("INF");
    else
        Console.WriteLine(res);
}
}
 
// This code is contributed by 29AjayKumar


输出:

1
INF
1

时间复杂度: O(N * log(N))

辅助空间: O(N)