小数化分数(C++)

【问题描述】
任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
【输出形式】
对每一个对应的小数化成最简分数后输出,占一行
【样例输入】
3
0.(4)
0.5
0.32(692307)
【样例输出】
4/9
1/2
17/52

【解题思路】
在这里插入图片描述
【示例代码】

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int zdgyz(int,int);
int main()
{
    int n;
    cin>>n;
    string str[n];
    for(int i=0;i<n;i++)
    {
        cin>>str[i];
    }
    for(int t=0;t<n;t++)
    {
         char a[15];
        strcpy(a,str[t].c_str());
        int l=0;
        l=strlen(a);
        int s1=0,s2=0;
        int b[9]={0};
        int c[9]={0};
        for(int i=2;i<l;i++)
        {
            if(a[i]!='(') {b[s1]=a[i]-48;s1++;}
            else {break;}
        }
        for(int j=2;j<l;j++)
        {
            if(a[j]=='(')
            {
                for(int k=j+1;k<l;k++)
                {
                    if(a[k]!=')') {c[s2]=a[k]-48;s2++;}
                    else {break;}
                }
            }
        }
        int x=1;
        double z=0;
        z=pow(10.0,s1);
        for(int i=0;i<s2;i++)
        {
            if(i==0) {x=9;}
            else {x=x*10+9;}
        }
        x=x*z;
        int p=0,q=0,o=0;
        for(int j=0;j<s1;j++)
        {
            p=p*10+b[j];
        }
        for(int k=0;k<s2;k++)
        {
            q=q*10+c[k];
        }
        if(s2==0) {o=p;}
        else {o=p*pow(10.0,s2)+q-p;}
        int m=0,e=0,f=0;
        m=zdgyz(x,o);
        e=x/m;
        f=o/m;
        cout<<f<<"/"<<e<<endl;
    }
    return 0;
}
int zdgyz(int p,int q)
{
    int o=0,f=0;
    p>q?o=q:o=p;
    for(int i=o;;i--)
    {
        if(p%i==0&&q%i==0) {f=i;break;}
    }
    return f;
}

若有更优方法,欢迎交流学习!

发布了19 篇原创文章 · 获赞 0 · 访问量 1547

猜你喜欢

转载自blog.csdn.net/qq_45909595/article/details/104095989