POJ-1930-Dead Fraction

378 篇文章 0 订阅

很费解这个题,最后卡了白天死在了全为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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值