很费解这个题,最后卡了白天死在了全为0的情况了~悲剧
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int inf=1<<29;
char str[100];
bool isallzero(char *str)
{
for(int i=2;i<strlen(str)-3;i++)
if(str[i]!='0')
return false;
return true;
}
long long pow(int a,int b)
{
long long ans=1;
for(int i=0;i<b;i++)
ans*=a;
return ans;
}
long long gcd(long long a,long long b)
{
if(b)
return gcd(b,a%b);
return a;
}
int main()
{
while(scanf("%s",str)!=EOF)
{
if(strlen(str)==1&&str[0]=='0')
break;
if(isallzero(str))
{
printf("0/1\n");
continue;
}
int len=strlen(str);
long long ansa=-1,ansb=inf;
long long upa,upb,downa,downb;
for(int i=2;i<len-3;i++)
{
upa=upb=downa=downb=0;
for(int j=2;j<i;j++)
upa=upa*10+str[j]-'0';
for(int j=i;j<len-3;j++)
upb=upb*10+str[j]-'0';
downa=pow(10,i-2);
downb=pow(10,len-3-2)-downa;
if(upa)
{
long long val=gcd(upa,downa);
upa/=val;
downa/=val;
}
if(upb)
{
long long val=gcd(upb,downb);
upb/=val;
downb/=val;
}
upa=upa*downb+upb*downa;
downa=downa*downb;
if(upa)
{
long long val=gcd(upa,downa);
upa/=val;
downa/=val;
}
if(ansa==-1||downa<ansa)
{
ansa=downa;
ansb=upa;
}
}
printf("%I64d/%I64d\n",ansb,ansa);
}
return 0;
}