洛谷题解-P1014 [NOIP 1999 普及组] Cantor 表
P1014 [NOIP 1999 普及组] Cantor 表
题目描述
现代数学的著名证明之一是 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斜行所有数分子分母之和为i+1.
某序号N对应的行数i可以根据等差数列来
while(sum<N){
i++;
sum+=i;
}
这个会找到序号N所在行数i,以及前面前i行个数之和sum
则前i-1行个数之和为sum-i
一行数从i/1或i/i开始,每次分子分母加减一,从开头到N就是加减N-sum+i-1
所以得出第N个数字是N-sum+i/i-(N-sum+i-1)(因为蛇形排序,奇数行分子分母刚好反过来)
代码如下
#define LOCA
#include<stdio.h>
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N;
scanf("%d",&N);
int i=1,sum=1;
while(sum<N){
i++;
sum+=i;
}
if(i%2==0){
printf("%d/%d",N-sum+i,i-N+sum-i+1);
}
else{
printf("%d/%d",i-N+sum-i+1,N-sum+i);
}
}

浙公网安备 33010602011771号