题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…
输入格式
整数N(1≤N≤10^7)。
输出格式
表中的第 N 项。
输入
7
输出
1/4
题解:
我们这里定义一个row代表每一个斜行,比如1/1为row=1的一个斜行,1/2,2/1为 row=2的一个斜行(必须要发现的规律是,第几行就有几个数字,第三行就有三个数字),而且奇数行按照上图显示的是从下往上走,偶数行是从上往下。
首先判断要找的数在第几行(这里的行是row代表的斜行):
int n=in.nextInt(); //要找的数
int row=1; //从第一行开始,且第一行只有一个数
while (n>row) {
n-=row; //目标数减去每行包含数的总数
/*比如n=5,减去第一行还剩4个数,
这时行数加一,此行数同时代表该行
的数得总数*/
row++;
}
通过判断要找的数所在斜行是奇还是偶数计算所得数,此时通过上述找第几行的循环,此时的n的含义是所在斜行对应数的分子或者分母,以下进行讨论。
① 如果是奇数行:从下往上,循环所剩的n值作为分子, row-n+1为分母。
② 如果是偶数行:从上往下,循环所剩的n值作为分母, row-n+1为分子。
完整代码:
import java.util.Scanner;
public class P1014NOIP1999普及组Cantor表 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int row=1;
while (n>row) {
n-=row;
row++;
}
if (row%2==0) System.out.println(n+"/"+(row-n+1));
else System.out.println((row-n+1)+"/"+n);
}
}