本文主要是介绍HDOJ 1717 小数化分数2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1717
题目:
小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2920 Accepted Submission(s): 1186
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
3 0.(4) 0.5 0.32(692307)
4/9 1/2 17/52
题意:将一个小数化成分数形式。
解题思路:
小数(除了无限不循环小数外)都可以化成分数。1.将有限小数化成分数,方法如下:0.25 * 100 = 25;0.25 = 25 / 100(约分即可得到0.25的小数表示);2.将循环小数化成分数,方法如下:0.32(692307) * 100 = 32.692307①;0.32(692307) * 10 ^ 8 = 32692307.(692307)②; ② - ①得:0.32(692307)* (10 ^ 8 - 100) = 32692275; 0.32(692307) = 32692275 / (10 ^ 8 - 100)(约分即可得到0.32(692307)的小数形式)。
代码:
#include <cstdio>
#include <cstring>int gcd(int m, int n)
{int r;while(n){r = m % n;m = n;n = r;}return m;
}
int main()
{int t;scanf("%d", &t);getchar();while(t--){char s[20];scanf("%s", s);int len = strlen(s), index = 0;for(int i = 0; i < len; i++){if('(' == s[i])index = i;}if(index){int a = index - 2, c = 0, f, m = 1, n = 1;int b = len - index - 2 + a;for(int i = 2; i < len - 1; i++){if(i == index){f = c;continue;}c = 10 * c + s[i] - '0';}c = c - f;while(a--) m *= 10;while(b--) n *= 10;int d = n - m, e = gcd(d, c);printf("%d/%d\n", c/e, d/e);}else{int a = 0, b = 1, m = len - 2;for(int i = 2; i < len; i++)a = 10 * a + s[i] - '0';while(m--) b *= 10;int c = gcd(a, b);printf("%d/%d\n", a/c, b/c);}}return 0;
}
这篇关于HDOJ 1717 小数化分数2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!