杭电1717关于将无限循环小数转化成分数

https://zhidao.baidu.com/question/7418774?qq-pf-to=pcqq.c2c
这个链接中是关于循环小数如何化成分数的
思路:分三种情况讨论
先讨论0.5
在讨论后面的,遇到0.32(56)这种情况先讨论括号前面的
#include
#include
#include
#include <string.h>
using namespace std;
long long gcd(int x,int y)
{
return y0?x:gcd(y,x%y);
}
long long shi(int n)
{
long long sum=1;
while(n–)
{
sum=sum*10;
}
return sum;
}
int main()
{
char s[1000];
int n;
scanf("%d",&n);
while(n–)
{
scanf("%s",s);
long long a,b;
int x=strlen(s),flag=0;
int sum=0,wei=0;
//考虑三种情况
for(int i=0;i<x;i++)
{
if(s[i]
’.’&&s[i+1]’(’)
flag=1;
if(s[i]
’.’&&isdigit(s[i+1]))
flag=-1;
}
int f=0;
for(int i=0;i<x;i++)
{
if(s[i]’(’)
f=-1;
}
//1、0.5
if(f
0)
{
for(int i=0;i<x;i++)
{
if(isdigit(s[i])&&i!=0)
{
sum=sum10+s[i]-‘0’;
wei++;
}
}
a=sum;
b=shi(wei);
}
else if(flag==1)
{
//0.(4)
for(int i=0;i<x;i++)
{
if(isdigit(s[i])&&i!=0)
{
sum=sum
10+s[i]-‘0’;
wei++;
}
}
a=sum;
b=shi(wei)-1;
}else if(flag==-1)
{
//0.32(3525)
int biao=0,xiao=0,xiaowei=0;
for(int i=0;i<x;i++)
{
if(s[i]!=’(’&&isdigit(s[i])&&i!=0)
{
sum=sum10+s[i]-‘0’;//求括号前的数字
wei++;
}
if(s[i]==’(’)
{
biao=i;//如果遇到括号标记
break;
}
}
for(int j=biao;j<x;j++)
{
if(isdigit(s[j]))
{
xiao=xiao
10+s[j]-‘0’;//求括号里面的数字
xiaowei++;
}
}
a=sum*shi(xiaowei)+xiao-sum;
b=shi(wei+xiaowei)-shi(wei);
}
cout<<a/gcd(a,b)<<"/"<<b/gcd(a,b)<<endl;
}
}

猜你喜欢

转载自blog.csdn.net/weixin_43514149/article/details/84647180
今日推荐