题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…
输入格式
整数N(1 <= N <=10^7)。
输出格式
表中的第 N项。
样例 #1
样例输入 #1
7
样例输出 #1
1/4
这道题看着很复杂,其实就是一个找规律的题目(虽然我起初也没看出来...)。
首先我们观察到第i行,第j列的数就是i/j,这是第一个要发现的。
因为题目中要求是以Z字型编号
我们看题目中的表是:
1/1,1/2,1/3……
2/1,2/2,2/3……
Z字型编号以后(把头向左偏45度):
第一行:1/1 (1号)
第二行:1/2(2号) 2/1(3号)
第三行:1/3(6号) 2/2(5号) 3/1(4号)
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int k=1;
while(n>k)
{
n=n-k;
k++;
}
if(k%2==0) cout<<n<<"/"<<k-n+1;
else cout<<k-n+1<<"/"<<n;
}
k表示当前遍历到的行数,第k行就有k个数,n不断减k,直至当前数的数量不够再凑成一行为止。偶数行时,为正序排列序号,奇数行时,为倒叙排列序号。