首页 » C++ » 小数化分数

小数化分数

原文 http://blog.csdn.net/secular_/article/details/79192638

2018-01-30 02:00:51阅读(597)

【问题描述】

   任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。

【输入形式】

   第一行是一个整数N,表示有多少组数据。
   每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

【输出形式】

    对每一个对应的小数化成最简分数后输出,占一行

【样例输入】

3
0.(4)
0.5
0.32(692307)
【样例输出】

4/9
1/2
17/52
【样例说明】
【评分标准】
由于输入的形式,需要将括号内外区分开来,此处用到cin.getline来对输入流中的下一输入进行预判。
具体代码如下:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
//约分操作,返回最大公因数:
 int yuefen(int m,int s){
 vector<int> aa,bb;
    int mm=0,nn=0;
    int mmm=m;
    int sss=s;
    for(int i=2;i<=m;i++){
        while((mmm%i)==0){
            aa.push_back(i);
            mmm=mmm/i;
            mm++;
        }       
    }
        for(int i=2;i<=sss;i++){
        while((sss%i)==0){
            bb.push_back(i);
            sss=sss/i;
            nn++;
        }       
    }
    vector<int> d;
    int cc=0;
    for(int i=0;i<mm;i++){
        for(int j=0;j<nn;j++){
            if(aa[i]!=0&&aa[i]==bb[j]){
                d.push_back(aa[i]);
                aa[i]=0;
                bb[j]=0;    
                cc++;
            }           
        }
    }
    int y=1;
    for(int i=0;i<cc;i++){
        y=y*d[i];
    }
return y;
}   
int main(){
int num;
cin>>num;
for(int i=0;i<num;i++){
//将括号内外分成两部分,一部分存在a,一部分存在b 
    int n;// 0
    char m;// .
    int aa=0;
    int bb=0;
    vector<int>a;
    vector<int>b;
    cin>>n>>m;int p=cin.get();
   while(p!=40&&p!='\n'){
        a.push_back(p-48); //0.234 输出 2 
        aa++;
        p=cin.get();
    }
    if(p=='(') //所有小数的情况一起考虑;如果是回车符 p==10;
    {   char s[10];
    cin.getline(s,10,')');
    //cout<<s; //s变成了一个string类的字符串 
    string sss=s;
    int ss=sss.size();
    for(int i=0;i<ss;i++){
        b.push_back(s[i]-48);
        bb++;
    } 
}
int g=0; //将a[aa]转换为整数g 
int h=0;   //将b[bb]转换为整数h
int gg=1;//记录g的分母 
int hh=1;//记录h的分母 
if(!a.empty()){
    for(int i=0;i<aa;i++){
        for(int j=0;j<aa-i-1;j++){
            a[i]=a[i]*10;
        }
    g=g+a[i]    ;
    }
}
for(int i=0;i<aa;i++){  
        gg=10*gg;   
    } 
if(!b.empty()){
    for(int i=0;i<bb;i++){
        for(int j=0;j<bb-i-1;j++){
            b[i]=b[i]*10;
        }
    h=h+b[i];
    }
}
}
if(gg==1 && hh!=1){//循环小数: 
hh=hh-1;
}
if(gg!=1 && hh!=1){//混小数: 
int hhh=gg*hh;
hh=hhh-gg;   
}
if(g!=0){
int yg=yuefen(g,gg);
g=g/yg;
gg=gg/yg;   
}
if(h!=0){
int yh=yuefen(h,hh);
h=h/yh;
hh=hh/yh;   
}
//两个分数约分相加
int k; //分子 
int f; //分母 
k=g*hh+h*gg;
f=gg*hh;
int ykf=yuefen(k,f);
k=k/ykf;
f=f/ykf;
cout<<k<<"/"<<f<<endl;  
}return 0;}

刚入坑,代码还比较丑,但是,emmmm,还是可以通过的~~~小数化分数

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹