8760:Cantor表
8760:Cantor表
-
总时间限制:
1000ms
-
内存限制:
65536kB
-
描述
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…给定N,求第N项。 -
输入
一个整数N(1≤N≤10000000)。
-
输出
一个分数,即表中的第N项。
-
样例输入
7 -
样例输出
1/4 -
来源
NOIP1999复赛 普及组 第一题
这个题还挺有意思的,之前面试的时候好像也出过类似的题
解决的思路就是遍历,然后分为四个状态:左边缘、上边缘、上行部分和下行部分
对于左边缘和上边缘两个不同的状态(第一个向下/向右,第二个就斜着了),设置两个标志hasDown和hasRight
设置标志Up和down来表示是在上行部分还是下行部分
这种题的好处就是非常好调试
代码如下:
package com.jiading.noi;
import java.util.Scanner;
/*
* 8760:Cantor表
* http://noi.openjudge.cn/ch0201/8760/
*/
public class Problem26 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Integer nInteger = scanner.nextInt();
Long aLong = (long) 1, bLong = (long) 1;
Integer count = 1;
boolean hasDown = false, hasRight = false, up = false, down = false;
while (count < nInteger) {
if (bLong == 1) {
if (aLong == 1) {
bLong++;
hasRight=true;
} else if (hasDown) {
aLong--;
bLong++;
up = true;
down = false;
hasDown = false;
} else {
aLong++;
hasDown = true;
}
} else if (aLong == 1) {
if (hasRight) {
aLong++;
bLong--;
up = false;
down = true;
hasRight = false;
} else {
bLong++;
hasRight = true;
}
} else if (up) {
aLong--;
bLong++;
} else if (down) {
aLong++;
bLong--;
}
count++;
//System.out.println("a:" + aLong + ",b=" + bLong);
}
System.out.println(aLong + "/" + bLong);
}
}

我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…给定N,求第N项。
浙公网安备 33010602011771号