【C++题解】[NOIP1999]Cantor表(升级版)

P a r t Part Part 1 1 1 读题

题目描述

现代数学的著名证明之一是 G e o r g Georg Georg C a n t o r Cantor Cantor证明了有理数是可枚举的。

他是用下面这一张表来证明这一命题的:(为防止大家看不清,博主已经进行放大)

1 1 1 2 1 3 1 4 1 5 … \frac 11 \frac 12 \frac 13 \frac14 \frac15 … 1121314151

2 1 2 2 2 3 2 4 … \frac21\frac22 \frac23 \frac24 … 12223242

3 1 3 2 3 3 … \frac31 \frac32 \frac33 … 132333

4 1 4 2 … \frac41 \frac42 … 1424

5 1 … \frac51 … 15

… …

这次与 N O I P NOIP NOIP 1999 1999 1999第一题不同的是:这次需输入两个分数不一定是最简分数),算出这两个分数的积(注意该约分的要约分)后输出积在原表的第几列第几行(若积是整数 1 积 \frac1积 1,则以“ 积 1 \frac积1 1”或“ 1 积 \frac1积 1”结算)。

输入格式

共两行。每行输入一个分数(不一定是最简分数)。

输出格式

两个整数,表示输入的两个分数的积在表中的第几列第几行注意该约分的要约分

输入样例

4/5
5/4

输出样例

1 1

数据范围与提示

输入的两个最简分数的分子 a a a与分母 b ≤ 2147483647 b≤2147483647 b2147483647,但要注意不一定是最简分数。

P a r t Part Part 2 2 2 思路

看到本题,一看十分简单,只需要求出两个分数的积,按照上面的表格,分子对应列,分母对应行,直接输出就行了。

但是这个题有个大坑:输入的两个数不一定是最简分数

所以我们需要化简直至最简分数,所以我们需要求出分母和分子的最大公因数,然后用原来的分子和分母分别去除,我们就得到了以下函数:

void wk(int a,int b){
	int r,n=a,m=b;//m、n分别代替a、b两数做运算
	if(a==b){//判断a、b两数是否相同,若相同直接输出1行1列
		cout<<"1 1";
		return;
	}
	while(n%m!=0){//求最大公因数
		r=n%m;
		n=m;
		m=r;
	}
	cout<<b/r<<" "<<a/r;//输出最简分数
}

我们只需要在主函数写一下简单的输入就可以了,这个题就完成啦!

小tip:大家可以先根据思路,写一下代码哦!

P a r t Part Part 3 3 3 代码

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d;
char e,f;
void wk(int a,int b){
	int r,n=a,m=b;
	if(a==b){
		cout<<"1 1";
		return;
	}
	while(n%m!=0){
		r=n%m;
		n=m;
		m=r;
	}
	cout<<b/r<<" "<<a/r;
}
int main(){
	cin>>a>>e>>b>>c>>f>>d;//本题不需要运用除号,作者这里直接读入成char,不参与后续运算
	wk(a*c,b*d);	
	return 0;
}

听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值