计算-小数相加-无限循环小数转为分数

小数相加

时间限制: 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;
}

 
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
typedef long long I64;
template<class T>
inline std::string ToString(T num) //转化num为字符串
{
        std::stringstream ss;
        ss<<num;
        return ss.str();
}
template<class ConvertTo,class ConvertFrom>  //使用方法示例:Convert<double>("234.456"),将转化"234.456"为double型数Convert<string>(123)就将123转化为字符串
inline ConvertTo Convert(ConvertFrom src)
{
        std::stringstream ss;
        ConvertTo ct;
        ss<<src;
        ss>>ct;
        return ct;
}
I64 Gcd(I64 m,I64 n) //求最大公约数
{
        if (m==0) return n;
        return Gcd(n%m,m);
}
class Fs
{
public:
	Fs(){}
	Fs(I64 fz,I64 fm=1):Fz(fz),Fm(fm){}
	Fs& YueFen()
	{
		if(Fz!=0)
		{
		I64 g=Gcd(Fz,Fm);
		Fz/=g;
		Fm/=g;
		}
		if(Fm<0) 
		{
			Fz=-Fz;
			Fm=-Fm;
		}
		return *this;
	}
	string ToString()
	{
		string str = ::ToString(Fz);
		if(Fm!=1 && Fz!= 0) str+="/"+::ToString(Fm);
		return str;
	}
	I64 Fz,Fm;
};
Fs& operator*=(Fs& f1,const Fs& f2)
{
	f1.Fz*=f2.Fz;
	f1.Fm*=f2.Fm;
	return f1.YueFen();
}
Fs& operator/=(Fs& f1,const Fs& f2)
{
	f1.Fm*=f2.Fz;
	f1.Fz*=f2.Fm;
	return f1.YueFen();
}

Fs operator/(const Fs& f1,const Fs& f2)
{
	return Fs(f1.Fz*f2.Fm,f1.Fm*f2.Fz).YueFen();
}
Fs operator*(const Fs& f1,const Fs& f2)
{
	return Fs(f1.Fz*f2.Fz,f1.Fm*f2.Fm).YueFen();
}
bool operator==(const Fs& f1,const Fs& f2)
{
	return f1.Fz==f2.Fz &&(f1.Fz==0 || f1.Fm==f2.Fm );
}
bool operator!=(const Fs& f1,const Fs& f2)
{
	return !(f1==f2);
}
Fs& operator-=(Fs& f1,const Fs& f2)
{
	return f1=Fs(f1.Fz*f2.Fm-f1.Fm*f2.Fz,f1.Fm*f2.Fm).YueFen();
}
Fs& operator+=(Fs& f1,const Fs& f2)
{
	return f1=Fs(f1.Fz*f2.Fm+f1.Fm*f2.Fz,f1.Fm*f2.Fm).YueFen();
}
Fs operator+(const Fs& f1,const Fs& f2)
{
	return Fs(f1.Fz*f2.Fm+f1.Fm*f2.Fz,f1.Fm*f2.Fm).YueFen();
}
int IntPow(int m,int n)
{
	int s=1;
	for(int i=0;i!=n;i++)
		s*=m;
	return s;
}
Fs getFs(string a,string b,string c)
{
	Fs f=Convert<int>(a);
	if(b[0]!='$')
		f+=Fs(Convert<int>(b),IntPow(10,b.size()));
	if(c[0]!='$') 
	{
		Fs ff=Fs(Convert<int>(c),IntPow(10,c.size())-1);
		if(b[0]!='$') ff/=IntPow(10,b.size());
		f+=ff;
	}
	return f;
}
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	int T;
	cin>>T;
	string a,b,c,d,e,f;
	while(T--)
	{
		cin>>a>>b>>c>>d>>e>>f;
		cout<<(getFs(a,b,c)+ getFs(d,e,f)).ToString()<<endl;

	}
}        






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值