小数化分数

【问题描述】

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

【输入形式】

   第一行是一个整数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,还是可以通过的~~~这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值