8760:Cantor表

8760:Cantor表

  • 总时间限制:

    1000ms

  • 内存限制:

    65536kB

  • 描述

    现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:img我们以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);
	}
}
posted @ 2020-06-28 15:39  别再闹了  阅读(154)  评论(0)    收藏  举报