`

11076 浮点数的分数表达

阅读更多

11076 浮点数的分数表达 

 

Description

在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果, 最好用分数来表示小数,有限小数或无限循环小数都可以转化为分数,无限循环小数的循环节用括号标记出来。如: 0.9 = 9/10 0.(3) = 0.3(3) = 0.3(33) = 1/3 当然一个小数可以用好几种分数形式来表示,我们只感兴趣最简的分数形式(即分母最小),如: 0.3(33) = 1/3 = 3/9 因为任何一个数都可以转化为一个整数和一个纯小数之和,整数部分较为简单无需做额外处理,只要将纯小数部分转化为分数形式,整数部分的分数部分就很简单了。 现在给定一个正的纯小数(这个纯小数为有限小数或无限循环小数),请你以最简分数形式来返回这个纯小数。

 

Input

给定一个纯小数,若是无限循环小数,用括号标记循环节,输入小数表达不超过100个字符。

Output

输出:化为最简分数形式,分子在前,分母在后,中间空格连接。

 

Sample Input

0.3(33)

 

Sample Output

1 3

 

浮点数的分数表达

浮点数的分数表达
=============================

(注:long long 是提交系统所需,在VC6.0下需该为 __int64 相应的输入输出格式为 %I64d )
ps.主要是longlong 类型要特别处理 不能用pow()
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
using namespace std;
 
long long GCD(long long bigNum,long long sNum) //辗转相除返回除数
{
    if(bigNum < sNum)
        return GCD(sNum,bigNum);
    long long res;
    if(sNum==0)
        return bigNum;
    res = bigNum%sNum;
    while(res)
    {
        bigNum = sNum;
        sNum = res;
        res = bigNum%sNum;
    }
    return sNum;
}
int isNum(char str[])
{
    for(int i=2; i<strlen(str); i++)
    {
        if(str[i]>'9'||str[i]<'0')
            return false;
    }
    return true;
}
 
int findCh(char str[],char ch)
{
    for(int i=2; i<strlen(str); i++)
    {
        if(str[i]==ch)
        {
            return i;
        }
    }
    return 0;
}
 
int main()
{
    char num[128];
    scanf("%s",&num);
    /*if(!isNum(num)){
        printf("%s","请输入正确数据!!");
        return 0;
    }*/
    int len = strlen(num);
    long long num1=0;
    long long num2;
    if(findCh(num,'(')==0)
    {
        for(int i=2; i<len; i++)
        {
            num1=num1*10+num[i]-'0';
        }
 
        //printf("%ld\n",num1);
 
        num2=1;
        for(int i=2; i<len; i++)
        {
            num2 *= 10;
        }
        //printf("%ld\n",num2);
 
        long long gcd = GCD(num1,num2);
        num1 /=gcd;
        num2 /=gcd;
 
        printf("%lld %lld\n",num1,num2);
        // cout << num1 << endl;
    }
    else
    {
        int start =findCh(num,'(');
        int end =findCh(num,')');
        int n = start-2;
        int m = end - start - 1;
//printf("%d %d\n",m,n);
        for(int i=2; i<start; i++)
        {
            num1=num1*10+num[i]-'0';
        }
//printf("%ld\n",num1);
 
        num2=0;
        for(int i=start+1; i<len-1; i++)
        {
            num2=num2*10+num[i]-'0';
        }
//printf("%ld\n",num2);
 
        long long mp = 1;
        for(int i=0; i<m; i++)
        {
            mp *=10;
        }
        long long np = 1;
        for(int i=0; i<n; i++)
        {
            np *=10;
        }
 
        num1 = num1*(mp-1)+num2;
        num2 = (mp-1)*np;
 
 
 
        long long gcd = GCD(num1,num2);
        num1 /=gcd;
        num2 /=gcd;
        printf("%lld %lld\n",num1,num2);
    }
 
    return 0;
}

 

分享到:
评论

相关推荐

    11076浮点数的分数表达

    11076 浮点数的分数表达 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数...

    浮点数的分数表达

    计算机算法设计与分析实验:浮点数的分数表达,可运行源代码,c++

    [Java]精确表达浮点数

    如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如: 0.9=9/10 0.33(3)=1/3=3/9 给定一个有限小数或者无限循环小数,你能否以分母最小的分数形式返回这个...

    小数转分数

    浮点数的分数表达 在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果, 最好用分数来表示小数,有限小数或无限循环小数都可以转化为分数,无限循环小数的循环节用括号...

    ybt_ssoier_cn

    1010 计算分数的浮点数值 输入样例1:10 3 输入样例2:11 3 输入样例3:100 10 输入样例4:233 13 1011 甲流疫情死亡率 1012 计算多项式的值 1013 温度表达转化 1014 与圆相关的计算 1015 计算并联电阻的阻值 1016 ...

Global site tag (gtag.js) - Google Analytics