nyoj-131 小数相加 循环小时转换分数

 

小数相加

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
 
描述

给你两个个小数,你能计算出它们的和是多少吗?

你肯定会说,so easy。

可是,如果这些小数中有的是无限循环小数呢?

无限循环小数一般有三部分,整数部分,小数不循环部分,和小数循环部分。
比如:
1.2(34)的三部分分别为1 2 34.
2.(04)的整数部分为2,小数不循环部分不存在,小数循环部分为04
2.4的整数部分为2,小数不循环部分为4,小数循环部分不存在
一般小数循环部分在小数的最后。
现在,请计算两个无限循环小数的和

 

 
输入
第一行输入一个整数N,表示有N行测试数据(1<=N<=100)
第二行输入六个字符串S1,T1,R1,S2,T2,R2,分别别示第一个和第二个循环小数的整数部分,小数不循环部分与小数部分。(如果该部分不存在,则输入$)
整数部分,小数不循环部分,循环部分长度皆不超过10位。
输入的各部分皆为正数。
输出
输出两个数的和,输出结果请转换成最简分数(不要写成带分数的形式)。(如果是整数则直接输出)
样例输入
3

1 $ 3 2 $ 3

0 1 3 0 $ 6

2 03 $ 2 4 $
样例输出
11/3

4/5

443/100


代码:
#include <iostream>

#include<algorithm>

#include<cstdio>

#include<cstring>

using namespace std;

long long  turn(long long x,long long y)

{

    while(y!=0)

    {

       int r=x%y;

       x=y;

       y=r;

    }

    return x;

}

long long ten(int x)

{

    long long sum=1;

    while(x)

    {

        sum*=10;

        x--;

    }

    return sum;

}

int main()

{

    int n,x,y;

    long long a,b,c,a1,b1,c1,w;

    long long u,d,u1,d1;

    char char1[21],char2[21],char3[21],char4[21],char5[21],char6[21];

    scanf("%d",&n);

    while(n--)

    {

        scanf("%s %s %s %s %s %s",char1,char2,char3,char4,char5,char6);

        x=strlen(char2);

        y=strlen(char3);

        if(char2[0]=='$'&&char3[0]!='$')

        {

            c=atoll(char3);

//字符串取long long 型,字符串取long型为atol,字符串取浮点型atof,字符串取整型atoi

            u=c;

            d=(ten(y)-1);

            w=turn(u,d);

            u/=w;d/=w;

        }

        else if(char2[0]!='$'&&char3[0]!='$')

        {

            b=atoll(char2); c=atoll(char3);

            u=(b*(ten(y)-1)+c);

            d=ten(x)*(ten(y)-1);

            w=turn(u,d);

            u/=w;d/=w;

        }

        else if(char2[0]!='$'&&char3[0]=='$')

        {

            u=atoll(char2);

            d=ten(x);

        }

        else

        {

            u=0;d=1;

        }



        x=strlen(char5);

        y=strlen(char6);

        if(char5[0]=='$'&&char6[0]!='$')

        {

            c1=atoll(char6);u1=c1;

            d1=(ten(y)-1);

            w=turn(u1,d1);

            u1/=w;d1/=w;

        }

        else if(char5[0]!='$'&&char6[0]!='$')

        {

            b1=atoll(char5);c1=atoll(char6);

            u1=(b1*(ten(y)-1)+c1);

            d1=ten(x)*(ten(y)-1);

            w=turn(u1,d1);

            u1/=w;d1/=w;

        }

        else if(char5[0]!='$'&&char6[0]=='$')

        {

            u1=atoll(char5);

            d1=ten(x);

        }

        else

        {

            u1=0;d1=1;

        }



        if(char1[0]=='$') a=0;

        else a=atoll(char1);



        if(char4[0]=='$') a1=0;

        else a1=atoll(char4);



        u=u*d1+u1*d;

        d*=d1;

        w=turn(u,d);

        u/=w;d/=w;

        

        u=(a+a1)*d+u;

        w=turn(u,d);

        u/=w;d/=w;

        

        if(d!=1)

        printf("%lld/%lld\n",u,d);

        else

        printf("%lld\n",u);

    }

    return 0;

}

代码COPY惊涛的,这个题主要学习,循环小数转换分数:

如0.33 转换应是 33/(10^2-1)就是33/99=1/3; 0.(abc) = abc/(10^3-1); 0.12(abc)=0.12+abc/(10^3-1)*100

还有就是求 最大公约数:

long long  turn(long long x,long long y)  

  • {  
  •     while(y!=0)  
  •     {  
  •        int r=x%y;  
  •        x=y;  
  •        y=r;  
  •     }  
  •     return x;  
  • }  

你可能感兴趣的:(转换)