1. 程式人生 > >杭電1717關於將無限迴圈小數轉化成分數

杭電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;
}
}