题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1/11/1 , 1/21/2 , 1/31/3 , 1/41/4, 1/51/5, …
2/12/1, 2/22/2 , 2/32/3, 2/42/4, …
3/13/1 , 3/23/2, 3/33/3, …
4/14/1, 4/24/2, …
5/15/1, …
…
我们以 Z 字形给上表的每一项编号。第一项是 1/11/1,然后是 1/21/2,2/12/1,3/13/1,2/22/2,…
输入格式
整数N(1≤N≤10⁷)。
输出格式
表中的第 N 项。
输入输出样例
输入#1
7
输出#1
1/4
思路
读完题目我也没有理解题目的Z字形是什么意思,至于最后做出来我都没有觉得这是一个Z字形。实际的路径是这样的
我们从斜角看这个路径就会发现这个路径就是一个三角形,随着n的增大,就会增加它的层数,后面的每一层都比前面的多一个; 其次,第二个关键点,就是它的每一层到底是最上面代表结束还是最左边代表结束呢,仔细观察,对于偶数层它是最左边结束,对于奇数层,他是最上面代表结束。
所以,首先,我们先要求出这个n处于第几层,这个很好计算的。
int sum=0,i=1;
while(sum<n) {
sum+=i;
i++;
}
i--;
这个i就是所处的层数,因为他在退出循环前i++,所以最重要减去这多余的一次。
然后就要判断这个最大层数的奇偶性了,
if((i&1)==1) {
int a=sum-n;
System.out.println((1+a)+"/"+(i-a));
}else{
int a=sum-n;
System.out.println((i-a)+"/"+(1+a));
}
与运算比除余运算效率能高一些。
如果是偶数层的话,那么n就会在sum的上面,
奇数层的话,n就会在sum的下面,
代码
import java.util.Scanner;
public class Cantor表 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int sum=0,i=1;
while(sum<n) {
sum+=i;
i++;
}
i--;
if((i&1)==1) {
int a=sum-n;
System.out.println((1+a)+"/"+(i-a));
}else{
int a=sum-n;
System.out.println((i-a)+"/"+(1+a));
}
}
}