小数转化分数

这个算法的根本原理是:一个分数对应一条直线的斜率。用数学语言描述就是:一条直线的斜率是无穷大(垂直于X轴)或者是(Y2-Y1) / (X2-X1),我们要做的就是找到2个整数,在指定的精度范围内接近这个斜率。对于正数来说,我们设置分子为0,分母为1,然后比较这个分数同给定的十进制数。如果我们的分数太小了(比如,我们选择的点在直线的下面),我们就加大分子的值直到这个分数太大(比如,这个点在直线的上方),之后我们在增加分母的大小直到这个点在直线下方。如果我们的最终目标是无理数(无限不循环小数),这个算法将一直继续,增加分子和分母,直到最终结果在指定的精度上。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

#include <stdlib.h>

#include <iostream.h>

#include <math.h>

int main()

{

     int iDecimal;

     int iNumerator, iDenominator, iNegative;

     double dFraction, dDecimal, dAccuracy, dInteger;

    

     cout << "请输入你要转换的数:";

     cin >> dDecimal;

    

     iDecimal = (int)dDecimal; //取整数部分,以在下一步判断输入的是否为整数

    

     if(iDecimal == dDecimal)  //判断输入是否为整数,若是则直接输出

     {

          cout << dDecimal << endl;

          return 0;

     }

    

     if(abs(iDecimal) >= 1)  //如果输入大于等于1,则分解为整数部分和小数部分

     {

          dInteger = iDecimal;

          dDecimal = dDecimal - iDecimal;

     }

     dAccuracy = 0.0001; //设置精度

     iNumerator = 0;  //初始分子

     iDenominator = 1;  //初始分母

     iNegative = 1;  //负数标志

     if(iDecimal <0)

          iNegative = -1;

     dFraction = 0;

     while (fabs(dFraction - dDecimal) > dAccuracy)  //判断精度是否达到要求

     {

          if(fabs(dFraction) > fabs(dDecimal))

               iDenominator = iDenominator + 1;     //增加分母

          else

               iNumerator = iNumerator + iNegative;     //增加分子

          dFraction = (double)iNumerator / (double)iDenominator;     //计算新的分数

     }

    

     if (abs(iDecimal) >= 1)

      cout << dInteger << ‘+‘ << ‘(‘ << iNumerator << ‘/‘ << iDenominator << ‘)‘ << endl;

    else

      cout << iNumerator << ‘/‘ <<iDenominator << endl;

     return 0;

}

时间: 2024-10-14 00:37:03

小数转化分数的相关文章

hdu1717 小数化分数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): 2921    Accepted Submission(s): 1187 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式

小数化分数2

小数化分数2 题目 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数. Input 第一行是一个整数N,表示有多少组数据. 每组数据只有一个纯小数,也就是整数部分为0.小数的位数不超过9位,循环部分用()括起来. Output 对每一个对应的小数化成最简分数后输出,占一行. Sample

无限小数转分数POJ1930分析

将无限小数化为分数,有一套简单的公式.使其轻松表示出来. 循环节 例如:0.121212…… 循循环节为12. 公式 这个公式必须将循环节的开头放在十分位.若不是可将原数乘10^x(x为正整数) 就为:12.121212……-0.121212……=12 100倍 - 1倍 =99 (99和12之间一条分数线) 此公式需用两位数字,其中两位数差出一个循环节. 再举一个例子:0.00121212…… 公式就变为:1212.121212……-12.121212……=1200 100000 倍 - 10

HDU1717小数化分数2

小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4278    Accepted Submission(s): 1725 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

(hdu step 2.1.8)小数化分数2(小数化分数——包括了循环小数化分数的情况)

题目: 小数化分数2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2783 Accepted Submission(s): 993   Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

HDU 2522 &amp; AOJ 441 &amp; AOJ 364 关于小数和分数的转换

总结一下小数和分数之间精确转换的方法. 首先是分数转换为小数,这个比较简单,先看题 http://acm.hdu.edu.cn/showproblem.php?pid=2522 输入一个n,求1/n的精确表示,如果有循环节只输出最小的一个. 手动模拟一下出发,会发现每次都是上一次除法剩下来的余数*10然后继续下一次计算,什么时候会出现循环呢,显然是余数出现重复的时候. 余数判断重复可以搞一个hash或者set,这里n不是特别大,直接用数组就可以了. 另外写的时候注意一下处理整除的情况. #inc

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); }

hdu1717 小数化分数

题目链接: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): 5375    Accepted Submission(s): 2188 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他

小数转化为分数

输入一个小于1的正小数,分别输出最简分数的分子和分母. 此代码的目的是简单快速的求出有限位小数对应的最简真分数. C语言代码如下: # include <stdio.h> # include <string.h> // 判断两个整数的最大公约数是否为1 int is_prime(int a, int b) { while (a != b) { a>b?(a-=b):(b-=a); } return b; } int main(void) { char ch[50]; int