[NOIP1999 普及组] Cantor 表
题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1 / 1 1/1 1/1 , 1 / 2 1/2 1/2 , 1 / 3 1/3 1/3 , 1 / 4 1/4 1/4, 1 / 5 1/5 1/5, …
2 / 1 2/1 2/1, 2 / 2 2/2 2/2 , 2 / 3 2/3 2/3, 2 / 4 2/4 2/4, …
3 / 1 3/1 3/1 , 3 / 2 3/2 3/2, 3 / 3 3/3 3/3, …
4 / 1 4/1 4/1, 4 / 2 4/2 4/2, …
5 / 1 5/1 5/1, …
…
我们以 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
样例输入 #1
7
样例输出 #1
1/4
#include <stdio.h>
/*思路简介:
以斜 45° 的视角看这个矩阵,第一行是 1/1 第二行是1/2, 2/1
这样规律就容易发现了 分子和分母的加和是 行数 + 1
枚举时 奇数行从左向右, 偶数行从右向左
先找到对应的行数, 再按规律枚举即可
*/
int main()
{
int n,i; // 第 i 行,第 n 向
scanf("%d",&n);
for (i = 1;; i++) // 判断第 n 项在哪一行
{
if (n>i) // 判断 n 是否大于当前行数, 大于则移向下一行, 小于则打断循环
n -= i;
else // 循环打断此时 n 为第 i 行第 n 个数
break;
}
if (i%2 == 0) // 按规律枚举输出
printf("%d/%d",n,i-n+1);
else // 按规律枚举输出
printf("%d/%d",i-n+1,n);
return 0;
}