[NOIP1999 普及组] Cantor 表
题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以 Z 字形给上表的每一项编号。第一项是 1 / 1 1/1 1/1,然后是 1 / 2 , 2 / 1 , 3 / 1 , 2 / 2 , … 1/2,\ 2/1,\ 3/1,\ 2/2,\dots 1/2, 2/1, 3/1, 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>
int main(void)
{
int n = 0, k = 1; // n 代表编号,k 代表行数(第 k 行有 k 个数)
scanf("%d", &n);
while (n > k) // 如 n > k,减去每行的个数
{
n -= k; // 减去之前每行的数,最终 n 就会等于在该行中的序号(如从左到右第几个)
++k; // 行数加 1
}
if (k % 2 == 0) // 如果行数是偶数行,则数是从右向左数的
printf("%d/%d\n", n, (k + 1 - n));
// 此时 n 的含义就是从右向左第几个,在该种情况下,分子就是 n,而分母等于k + 1 - n
else // 如果行数是奇数行,则数是从左向右数的
printf("%d/%d\n", k + 1 - n, n);
// 此时 n 的含义就是从左向右第几个,在该种情况下,分母就是 n,而分子等于 k + 1 - n
return 0;
}