题目描述
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1/1 1/2 1/3 1/4 1/5 …
2/1 2/2 2/3 2/4 …
3/1 3/2 3/3 …
4/1 4/2 …
5/1 …
… 这次与NOIp1999第一题不同的是:这次需输入两个分数(不一定是最简分数),算出这两个分数的积(注意该约分的要约分)后输出积在原表的第几列第几行(若积是整数或1/积,则以“积/1”或“1/积”结算)。
输入格式
共两行。每行输入一个分数(不一定是最简分数)。
输出格式
两个整数,表示输入的两个分数的积在表中的第几列第几行,注意该约分的要约分。
输入输出样例
输入
4/5 5/4
输出
1 1
说明/提示
所有数据:两个分数的分母和分子均小于10000
注意: 遍历字符串时下标i外置,“/”用来分割子串,提取前半部分并转化为数值作为分子x,后半部分作为分母y;进而分别求两分数分子积a、分母积b,再求它俩的最大公约数g; a/g,b/g即最终所求
#include <iostream>
using namespace std;
int gcd(int x,int y)//两个正整数的最大公约数
{
int z=1;
while(y)
{
z=x%y;
x=y;
y=z;
}
return x;
}
int main()
{
char s1[12]={'\0'},s2[12]={'\0'};
//cout<<s1<<" "<<s2;
int x1,x2,y1,y2;//x1,x2分别表示两数分子,y1,y2表分母
x1=x2=y1=y2=0;
cin>>s1>>s2;
int i;
for(i=0;s1[i]!='/';++i)//提取第一个数分子
x1=x1*10+(s1[i]-'0');
for(++i;s1[i];++i)//提取第一个数分母
y1=y1*10+(s1[i]-'0');
for(i=0;s2[i]!='/';++i)//第二个数分子分母
x2=x2*10+(s2[i]-'0');
for(++i;s2[i];++i)
y2=y2*10+(s2[i]-'0');
x1*=x2;//对应的分子相乘
y1*=y2;//对应的分母相乘
i=gcd(x1,y1);//取相乘后x1,y1最大公约数
cout<<y1/i<<" "<<x1/i<<endl;
return 0;
}