杭电1717小数化分数2

小数化分数2

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


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

 题意明确,但这题主要让我复习了一下字符串和数字的转化,其中的核心代码为(其中num为string类):

 for(i = 2; i < len; i++)
        {
            sum = 10 * sum + (num[i] - '0');
        }

然后就是小数化为分数的算法:

1.普通小数:就是 sum/10^len

2.循环小数:

一个混循环小数的小数部分可以化成分数:
这个分数的分子是第二个循环节以前的小数部分组成的数与小数部分中不循环部分组成的数的差。
分母的头几位数是9,末几位是0。其中9的个数与循环节中的位数相同,0的个数与不循环部分的位数相同。

举例:

0.13333……化为分数
分子:13-1=12
分母:循环节1位,不循环部分1位,因此是90
即0.13333……=12/90=2/15

最后根据GCD化简

然后就是实际代码实现了,代码实现过程中有两个地方要注意:

1.就是开始输入几组数据的时候要注意,之后把它getchar了,不然会被cin给取走。

2.就是别用gats(),用了就会wa,具体原因不是很清楚。

奉上代码:

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
#include<stdio.h>
using namespace std;
int gcd(int a,int b)
{
    int big=a;
    int smal=b;
    int ck;
    if(big<smal)
    {
        ck=a;
        a=b;
        b=a;
    }
    int temp;
    while(smal>0)
    {
        temp=big%smal;
        big=smal;
        smal=temp;
    }
    return big;
}


int main()
{
   int n;
   //char a[1000];
   cin>>n;
   getchar();
   //gets(a);
   while(n--)
   {
    //char num[128];
    string num;
    cin>>num;
    //gets(num);
    int i, len = num.length(), sum = 0,flag=0;//若flag==1则是循环小数
    int sum2=0,len9=0,len0=0;
    for(int ii=0;ii<len;ii++)
    {
        if(num[ii]=='(')
        {
            flag=1;
            break;
        }
    }

    if(flag==0)//非循环小数
    {
        for(i = 2; i < len; i++)
        {
            sum = 10 * sum + (num[i] - '0');
        }
        //int x = log10(sum) + 1;
        //int y = (int)(pow(10, x) + 0.5);
       int y=1;
       for(int j=0;j<len-2;j++)
       {
           y=y*10;
       }
        int ans = gcd(sum, y);

        printf("%d/%d
", sum / ans, y / ans);
    }
    else
    {
        for(i = 2; i < len; i++)
        {
            if(num[i]!='('&&num[i]!=')')
            {
                sum = 10*sum+(num[i]-'0');
            }
        }
         for(i = 2; i < len; i++)
        {
            if(num[i]=='(')
            {
                break;
            }
            sum2=10*sum2+(num[i]-'0');
            len0++;
        }
        int fenzi=sum-sum2;
        int sum9=0;
        len9=len-4-len0;
        for(i=0;i<len9;i++)
        {
            sum9=sum9*10+9;
        }
        for(i=0;i<len0;i++)
        {
            sum9=sum9*10;
        }
        int ans=gcd(fenzi, sum9);
         printf("%d/%d
", fenzi / ans, sum9/ ans);
    }
 }
    return 0;


}
原文地址:https://www.cnblogs.com/William-xh/p/7295560.html