小数化分数2

本文介绍了一种将小数(包括循环小数)转换为最简分数形式的算法,并提供了完整的C++实现代码。该算法适用于数学计算及编程竞赛。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小数化分数2

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2610 Accepted Submission(s): 932
 
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


这题是一道很基础的数论题目,只要掌握将无限循环小数转化成分数的规则,就可以迎刃而解了,对于0.(1)=1/9;对于0.0(1)=1/90;进行转化即可。0.1(1)=0.1+0.0(1);

#include<iostream>
#include<string>
using namespace std;


string str;


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


void easy(){
    int num=1,sum=0;
    for(int i=str.length()-1;str[i]!='.';i--){
        sum+=(str[i]-'0')*num;
        num*=10;
    }
    cout<<sum/gcd(sum,num)<<"/"<<num/gcd(sum,num)<<endl;
}


void fact(){
    int sum=0,num=0,no=1;
    if(str[2]=='('){
        for(int i=str.length()-2;str[i]!='(';i--){
            sum+=(str[i]-'0')*no;
            no*=10;
            num=num*10+9;
        }
        cout<<sum/gcd(sum,num)<<"/"<<num/gcd(sum,num)<<endl;
    }
    else{
        int i;
        for( i=str.length()-2;str[i]!='(';i--){
            sum+=(str[i]-'0')*no;
            no*=10;
        //cout<<sum<<endl;
        }
         int result=sum,f=1;
         i--;
         sum=0;
        for(;str[i]!='.';i--){
            sum+=(str[i]-'0')*f;
            f*=10;
            no*=10;
        }
        no=no-f;
        //cout<<no<<" "<<f<<" "<<sum<<endl;
        //cout<<no<<endl;
        num=no/f*sum+result;
        //cout<<num<<endl;
        cout<<num/gcd(num,no)<<"/"<<no/gcd(num,no)<<endl;
    }
}


int main(){
    int n;
    while(cin>>n){
        while(n-->0){
            cin>>str;
            int flag=0;
            for(int i=0;i<str.length();i++){
                if(str[i]=='('){
                    flag=1;
                    fact();
                }
            }
            if(!flag) easy();
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值