P2399 non hates math- 普及+/提高-模拟

在这里插入图片描述
这个就是纯粹的数学问题啊,废了半天劲!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
思路:在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <algorithm>
#include <iomanip>
#include <map>
#include <queue>
#include <vector>
#include <set>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long ll;
using namespace std;
ll gcd(ll a, ll b)
{
    
    
    return b == 0 ? a : gcd(b, a % b);
}
int main()
{
    
    
    string s; cin >> s;
    int n = s.size();
    int flag = 1; 
    for (int i = 0; i < n; i++)
    {
    
    
        if (s[i]=='(')
        {
    
    
           
            if (s[i - 1] == '.')//纯循环小数
            {
    
    
                flag = 2;
            }
            else flag = 3;
                break;
        }
    }
    if (flag == 1)//纯小数
    {
    
    
        ll ans=0;
        ll sum = 1; int sign = 0;
        for (int i = 0; i < n; i++)
        {
    
    
            if (s[i] != '.')
            {
    
    
                ans = ans * 10 + s[i] - '0';
            }
            else sign = 1;
            if (sign==1)
                sum=sum*10;
        }
        sum /= 10;
        ll h = gcd(sum, ans);
        cout << ans / h << "/" << sum / h << endl;
    }
    else if (flag == 2)//纯循环小数
    {
    
    
        int z = 0; int sign = 0;
       ll xiao = 0; int gg = 0;
       ll n9 = 0;
        for (int i = 0; i < n; i++)
        {
    
    
            if (s[i] == '.')
                sign = 1;
            if (sign == 0)
                z = z * 10 + s[i] - '0';
            if (sign == 1)
            {
    
    
                gg = 1;
                for (int j = i + 1; j < n; j++)
                {
    
    
                    if (s[j]!= '('&&s[j] != ')')
                    {
    
    
                       
                        n9 = n9 * 10 + 9;
                        xiao =xiao*10+s[j]-'0'; 
                      
                    }
                }
            }
            if (gg == 1) break;
        }
        
        ll h = gcd(z*n9+xiao, n9);
        cout << (z*n9+xiao) / h << "/" << n9 / h << endl;
    }
    else if (flag == 3)
    {
    
    
        int sign1 = 0, sign2 = 0,sign3=0;
        int z = 0; ll a = 0, b = 0; ll n9 = 0;
        int uu = 0;
        for (int i = 0; i < n; i++)
        {
    
    
            if (s[i] == '(')
            {
    
    
                sign3 = 1; b = a;
            }
            if (s[i] == '.')
            {
    
    
                sign1 = 1; sign2 = 1;
            }
            if (sign1 ==0)
                z = z * 10 + s[i] - '0';
            if (sign2 == 1 && sign3 !=1&&s[i]!='.')//小数点以后 括号之前
            {
    
    
                a = a * 10 + s[i] - '0'; uu++;
            }
                if (sign3 == 1&&s[i]!='('&&s[i]!=')')
                {
    
    
                    b = b * 10 + s[i] - '0';
                    n9 = n9 * 10 + 9;
                }           
        }
        for (int i = 1; i <= uu; i++)
            n9 = n9 * 10;
        ll q = (b - a) + z * n9;
        ll h = gcd(q, n9);
        cout << q / h << "/" << n9 / h << endl;
    }
    
   
}


      
            
 

猜你喜欢

转载自blog.csdn.net/weixin_45988242/article/details/107634008