小数相加
时间限制: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;
- }