【问题描述】
任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数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;
}
若有更优方法,欢迎交流学习!