洛谷 1482 Cantor表

5 篇文章 0 订阅
3 篇文章 0 订阅

题目描述

现代数学的著名证明之一是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;
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值