【问题描述】
任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数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,还是可以通过的~~~