hdu1717

动态规划做得好腻啊!但是前几天的小测试,来了一个动态规划,结果还是搞不出来。换换口味,就去做杭电的题目,结果wa的好久。好不爽啊,HDU1717挺有趣的一个题目,把小数转换成分数。一直错的测试数据是0.000(5)就是前面算出来是0的。

说一下循环小数转换成分数的过程吧,这个在初中的时候有学过。

就是乘一个数然后剪掉循环部分,这个还是来看个例子你就能明白了:

比如

设x=0.32(67)    //()里面的表示循环的部分

   n=0.32(67)*100 = 32.(67) //100是因为不循环部分有两位。后面的67依旧循环。

   m=0.32(67)*10000 = 3267.(67) //10000是32和循环部分加起来有四位。67依旧循环。

接下去就很明了了m - n = x*(10000-100)  

x=(m-n)/(10000-100)

算出来以后不要忘记化简,化简其实就是求一下两个数的最大公约数

下面是我的代码

#include<cstring>
#include<cstdio>

int n;
char str[30];
bool tt;

int gcd(int a, int b) 
{
	if(a == 0) return b;
    if(b % a == 0) return a;
    else
	return gcd(b % a, a);
}

int main()
{
    int i, j;
    int x, y;
    int k, p;
    scanf("%d", &n);
	while(n--)
	{
		getchar();
		scanf("%s", str);
		j = strlen(str);  tt = 0;
		for(i = 2; i < j; ++i)
		{
			if(str[i] == '('){
				tt = 1;
				break;
			}
		}
		if(tt == 0){
			x = str[2] - '0';  y = 10;
			for(i = 3; i < j; ++i)
				x = x * 10 + (str[i] - '0'), y *= 10;
		    j = gcd(x, y);
			printf("%d/%d\n", x / j, y / j);
		}
		else{
			x = 0; k = 1; i = 2;
			for( ; str[i] != '('; ++i)
				x = x * 10 + (str[i] - '0'), k *= 10;
			y = x;  p = k;
			for(++i; str[i] != ')'; ++i)
				y = y * 10 + (str[i] - '0'), p *= 10;
	    	y -= x;
	    	x = p - k;
			j = gcd(x, y);
			printf("%d/%d\n", y / j, x / j);
		}

    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值