hdu 1717

小数化分数2

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3037    Accepted Submission(s): 1237

Problem Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

Input

第一行是一个整数N,表示有多少组数据。 每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

Output

对每一个对应的小数化成最简分数后输出,占一行。

Sample Input

3 0.(4) 0.5 0.32(692307)

Sample Output

4/9 1/2 17/52

Source

2007省赛集训队练习赛(2)

Recommend

lcy

题解:首先要知道无限循环小数分数形式的构造方法:分子为最小循环节,分母为对应位数的99..9 如已知无限循环小数:0.568568……以568为循环节,那么这个小数的分数形式就是568/999,题中,我们将小数的有限部分和无限循环部分分开处理,得到两个分数,再相加化简,所得即为所求。

来源:http://www.cnblogs.com/kevince/p/3905378.html

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #include<cstdio>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<queue>
  8 #include<map>
  9
 10 #define N 1010
 11 #define M 15
 12 #define mod 1000000007
 13 #define mod2 100000000
 14 #define ll long long
 15 #define maxi(a,b) (a)>(b)? (a) : (b)
 16 #define mini(a,b) (a)<(b)? (a) : (b)
 17
 18 using namespace std;
 19
 20 int T;
 21 char s[N];
 22 int f1,f2;
 23
 24 ll gcd(ll x,ll y)
 25 {
 26     if(y==0)
 27         return x;
 28     return gcd(y,x%y);
 29 }
 30
 31 int main()
 32 {
 33     int i;
 34     //freopen("data.in","r",stdin);
 35     scanf("%d",&T);
 36     getchar();
 37     //for(int cnt=1;cnt<=T;cnt++)
 38     while(T--)
 39     //while(scanf("%d%d",&n,&q)!=EOF)
 40     {
 41         scanf("%s",s);
 42        // getchar()
 43         //printf(" %s\n",s);
 44         int l=strlen(s);
 45         int flag=0;
 46         f1=f2=0;
 47         ll x1;
 48         ll a,x;
 49         ll b=0;
 50         ll te;
 51         a=0;
 52         x1=1;
 53         x=1;
 54         ll g1,g2;
 55         ll y;
 56         for(i=2;i<l;i++){
 57             if(flag==0)
 58             {
 59                 if(s[i]!=‘(‘){
 60                     f1=1;
 61                     x1*=10;
 62                     b*=10;
 63                     b+=s[i]-‘0‘;
 64                 }
 65                 else{
 66                     flag=1;
 67                     f2=1;
 68                 }
 69             }
 70             else{
 71                 if(s[i]!=‘)‘){
 72                     x*=10;
 73                     a*=10;
 74                     a+=s[i]-‘0‘;
 75                 }
 76             }
 77            // printf("   %d %d %I64d %I64d %I64d %I64d\n",i,flag,b,x1,a,x);
 78         }
 79         //printf("   %d %d %I64d %I64d %I64d %I64d\n",f1,f2,b,x1,a,x);
 80        te=1;
 81        if(f1==1){
 82             g1=gcd(b,x1);
 83             if(g1!=0){
 84                 b/=g1;
 85                 te=x1;
 86                 x1/=g1;
 87             }
 88        }
 89
 90         if(f2==1){
 91             y=x-1;
 92             y*=te;
 93             g2=gcd(a,y);
 94             if(g2!=0){
 95                 a/=g2;
 96                 y/=g2;
 97             }
 98         }
 99
100
101
102         //printf(" %d %d %d %d\n",b,x1,a,y);
103         //printf("   %d %d %I64d %I64d %I64d %I64d\n",f1,f2,b,x1,a,y);
104         if( (f1+f2)==2){
105            // y*=x1
106
107             ll c=(x1*a+y*b);
108             ll d=y*x1;
109             // printf(" %I64d/%I64d\n",c,d);
110             ll g3=gcd(c,d);
111             if(g3!=0){
112                 c/=g3;
113                 d/=g3;
114             }
115             printf("%I64d/%I64d\n",c,d);
116         }
117         else{
118             if(f1==1)
119                 printf("%I64d/%I64d\n",b,x1);
120             else
121                 printf("%I64d/%I64d\n",a,y);
122         }
123
124
125
126
127
128
129     }
130
131     return 0;
132 }

hdu 1717,布布扣,bubuko.com

时间: 2024-10-11 22:20:36

hdu 1717的相关文章

小数化为最简分式 (hdu 1717)

hdu 1717 小数化分数 分析: 无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数. 无限不循环小数不能化分数; 考虑:无限循环小数又是如何化分数的呢? 例如:0.325656--×100=32.5656--① 0.325656--×10000=3256.56--② 用②-①即得: 0.325656--×9900=3256.5656---32.5656-- 0.325656--×9900=3256-32 所以, 0.325656--=3224/9900 代码: #incl

hdu 1717 小数化分数2 (数论)

点我点我点我!!! 接下来要做的就是模拟上述过程了. 静下来想一下自己要得到的信息. 然后拿出来,就可以了,模拟嘛,都是这样的. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char str[20]; int gcd(int a,int b) { return a%b==0?b:gcd(b,a%b); }

HDU 1717 小数化分数2

http://acm.hdu.edu.cn/showproblem.php?pid=1717 之前莫名WA了挺多次的有趣的题orz 感觉还是写麻烦了 注意字符串处理 代码:  0MS  1068K #include <cstdio> #include <cstring> using namespace std; int gcd(int m, int n) { int r; while (n) { r = m % n; m = n; n = r; } return m; } int

(小数化分数)小数化分数2 -- HDU --1717

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717 举例: 0.24333333…………=(243-24)/900=73/3000.9545454…………=(954-9)/990=945/990=21/22 代码: #include<stdio.h> #include<string.h> #define N 110 int gcd(int a, int b) { return b==0?a:gcd(b, a%b); } int ma

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};