[NOIP1999 普及组] Cantor 表
题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以 Z 字形给上表的每一项编号。第一项是 1 / 1 1/1 1/1,然后是 1 / 2 1/2 1/2, 2 / 1 2/1 2/1, 3 / 1 3/1 3/1, 2 / 2 2/2 2/2,…
输入格式
整数 N N N( 1 ≤ N ≤ 1 0 7 1 \leq N \leq 10^7 1≤N≤107)。
输出格式
表中的第 N N N 项。
输入输出样例
输入 #1
7
输出 #1
1/4
1.题意解析
对于这道题,我们只需要观察上面的那个图,就可以很清楚的找到规律,如下图:
我们可以发现,每一次枚举有两个任务:
·大任务:枚举分子分母和为
i
的所有分数直到第n
个
·小任务:i
为奇数时按分子递增的顺序输出,否则按分子递减的顺序输出
那么就根据这两个要求模拟就行了。
2.代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,cnt=0;//用cnt储存当前枚举到第几个分数
cin>>n;
for(int i=2;cnt<=n;i++)//记录当前分子分母的和
if(i%2==1)
{
for(int j=1;cnt<=n&&j<i;j++)//枚举分子
if(++cnt==n)
{
cout<<j<<'/'<<i-j;//输出分数
break;
}
}
else
{
for(int j=i-1;cnt<=n&&j>=1;j--)//枚举分子
if(++cnt==n)
{
cout<<j<<'/'<<i-j;//输出分数
break;
}
}
return 0;
}