zoukankan      html  css  js  c++  java
  • 小数化分数2(分数化小数)

    小数化分数2

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

    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
     

    题解:分数化小数,本来的思路是先找到小数,再进行转换,但是一直wa,最后直接不找小数了,直接乘10就ac了。。。小数应该是精度的问题。。。

    http://zhidao.baidu.com/question/15843599.html

     众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几、百分之几、千分之几……的数。那么无限小数能否化成分数? 

    首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数。无限不循环小数不能化分数,这在中学将会得到详尽的解释;无限循环小数是可以化成分数的。那么,无限循环小数又是如何化分数的呢?由于它的小数部分位数是无限的,显然不可能写成十分之几、百分之几、千分之几……的数。其实,循环小数化分数难就难在无限的小数位数。所以我就从这里入手,想办法“剪掉”无限循环小数的“大尾巴”。策略就是用扩倍的方法,把无限循环小数扩大十倍、一百倍或一千倍……使扩大后的无限循环小数与原无限循环小数的“大尾巴”完全相同,然后这两个数相减,“大尾巴”不就剪掉了吗!我们来看两个例子:

    ⑴    把0.4747……和0.33……化成分数。

    想1:        0.4747……×100=47.4747……   

    0.4747……×100-0.4747……=47.4747……-0.4747……

    (100-1)×0.4747……=47

    即99×0.4747…… =47 

    那么  0.4747……=47/99



    想2: 0.33……×10=3.33……

    0.33……×10-0.33……=3.33…-0.33……

    (10-1) ×0.33……=3

    即9×0.33……=3

    那么0.33……=3/9=1/3

    由此可见, 纯循环小数化分数,它的小数部分可以写成这样的分数:纯循环小数的循环节最少位数是几,分母就是由几个9组成的数;分子是纯循环小数中一个循环节组成的数。

    ⑵把0.4777……和0.325656……化成分数。

    想1:0.4777……×10=4.777……①

    0.4777……×100=47.77……②

    用②-①即得: 

    0.4777……×90=47-4

    所以, 0.4777……=43/90



    想2: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

    将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.

      将混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.

    代码:

     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    using namespace std;
    const int INF=0x3f3f3f3f;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define SD(x,y) scanf("%lf%lf",&x,&y)
    #define P_ printf(" ")
    char s[50];
    void js(bool k,double &x,char c,int &xx){
    	/*if(k){
    		x=x*10+c-'0';
    	}
    	else xx*=10,x=x+1.0*(c-'0')/xx;*/
    	if(!k)xx*=10,x=x*10+c-'0';
    }
    int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
    int main(){
    	int T;
    	SI(T);
    	while(T--){
    		mem(s,0);
    		scanf("%s",s);
    		bool kg1=true,kg2=true;
    		int aa=1,bb=1;
    		double a=0,b=0;
    		for(int i=0;s[i];i++){
    			if(s[i]==')')continue;
    			if(s[i]=='.'){
    				kg1=false;continue;
    			}
    			if(s[i]=='('){
    				kg2=false;continue;
    			}
    			if(kg2)js(kg1,a,s[i],aa),b=a,bb=aa;
    			else js(kg2,b,s[i],bb);
    		}
    		int x,y;
    	//	printf("%lf %d %lf %d
    ",a,aa,b,bb);
    		if(kg2)x=a,y=aa;
    		else x=(int)(b)-(int)(a),y=bb-aa;
    	//	printf("x=%d y=%d
    ",x,y);
    		int d=gcd(x,y);
    		if(x%y==0)printf("%d
    ",x/y);
    		else printf("%d/%d
    ",x/d,y/d);
    	}
    	return 0;
    }
    

     

      

     

  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5121336.html
Copyright © 2011-2022 走看看