zoukankan      html  css  js  c++  java
  • 编程之美--2.6

    这里和上一题关于gcd的都没有考虑大数运算相关的。

    题目描述:求浮点数的精确表示

    思路:通过分数来进行表示最精确,所以问题转化成了如何通过分数表示浮点数

    (1)非循环小数:c.a(其中c表示一个整数,a表示一个整数),那么分数就是(c*(10^n)+a)/10^n,其中n为a的位数,最后约分

    (2)循环小数:c.a(b)(b是循环部分)

    假设b为m位,那么10^m*0.(b))= b + 0.(b),那么0.(b) = b/(10^m-1),

    c.a(b) = (c*10^n+a+0.(b))/10^n = (c*10^n+a+b/(10^m-1))/10^n = (c*10^n*10^m-1+a*10^m-1+b)/10^m-1*10^n

    #include <iostream>
    #include <queue>
    #include <climits>
    #include <algorithm>
    #include <memory.h>
    #include <stdio.h>
    using namespace std;
    
    static int num_1 = 0;
    static int num_2 = 0;
    static int num_3 = 0;
    int gcd_1(int a,int b)
    {
        if(b == 0)
        {
            ++num_1;
            return a;
        }
        else
        {
            ++num_1;
            return gcd_1(b,a%b);
        }
    }
    int gcd_2(int a,int b)
    {
        if(b == 0)
        {
            ++num_2;
            return a;
        }
        if(a < b)
        {
            ++num_2;
            return gcd_2(b,a);
        }
        ++num_2;
        return gcd_2(b,a-b);
    }
    int gcd_3(int a,int b)
    {
        ++num_3;
        if(b == 0)
        {
            return a;
        }
        if(a < b)
        {
            return gcd_3(b,a);
        }
        if(a & 1 == 0)
        {
            if(b & 1 == 0)
            {
                return (gcd_3(a>>1,b>>1)<<1);
            }
            else
            {
                return gcd_3(a>>1,b);
            }
        }
        else
        {
            if(b & 1 == 0)
            {
                return gcd_3(a,b>>1);
            }
            else
            {
                return gcd_3(b,a-b);
            }
        }
    }
    
    int main()
    {
        int c,a,b;
        scanf("%d.%d(%d)",&c, &a, &b);
        if (a==0 && b==0)
            cout << c;
        else
        {
            // 分子up,分母down
            long long up = c;
            long long down = 1;
            long long ta = a;
            while (ta)
            {
                down *= 10;
                ta /= 10;
            }
            up = c*down+a;
            if (b!=0)
            {
                long long wb = 1;
                long long tb = b;
                while (tb)
                {
                    wb *= 10;
                    tb /= 10;
                }
                up = up*(wb-1)+b;
                down = down*(wb-1);
            }
            long long fac = gcd_3(up, down);
            cout << up/fac << "/" << down/fac << endl;
        }
        return 0;
    }
  • 相关阅读:
    智能制造及其十大关键技术
    浅谈华为验厂对MES系统的要求
    aps系统切换切记“三要三不要”
    周黑鸭借力MES,推进智能生产
    MES助力伊利集团打造智慧工厂
    智能制造下一个风口:工业智能
    大规模定制模式之于MES的三点思考
    APS中生产计划排程模块的基本原理
    通读审计之wiinews
    wiinews sql注入漏洞分析
  • 原文地址:https://www.cnblogs.com/cane/p/3803081.html
Copyright © 2011-2022 走看看