小数相加
时间限制:
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
-
第一行输入一个整数N,表示有N行测试数据(1<=N<=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;
}
}