Cantor的数表

题目描述

如下数列,前5项分别是1/1,1/2,2/1,3/1,2/2……。输入n,输出第n项。

1/1   1/2   1/3   1/4   1/5

2/1   2/2   2/3   2/4

3/1   3/2   3/3

4/1   4/2

5/1

样例输入

3

14

7

12345

样例输出

2/1

2/4

1/4

59/99

分析:数表提示我们按照斜线分类。第1条斜线有1个数,第二条有2个数,第3条有3个数,.....第i条有i个数。这样,前i条斜线一共有S(k)=1+2+3+....+k=k*(k+1)/2个数。

n在哪条斜线上呢?只要找到一个最小的的正整数k,使得n<=S(k),那么n就是第k条斜线上的倒数第S(k)-n+1个元素(最后一个元素是倒数第1个元素,而不是倒数第0个元素)。

不难看出,第k条斜线的倒数第i个元素是i/(k+1-i)。

注:当k为偶数时,是从小往上数的,此时为(k+1-i)/i;当k为奇数时,是从上往下数的,此时为i/(k+1-i).


Java代码实现:

package java541;

import java.util.Scanner;

public class Cantor的数表 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext())
		{
			int k = 0,i = 0;
			int inputInt = scanner.nextInt();
			//首先算出k
			while(k*(k+1)/2 < inputInt)
			{
				++k;
			}
			i = k*(k+1)/2-inputInt+1;
			if(k%2 == 0)
			{
				System.out.println((k+1-i)+"/"+i);
			}
			else
			{
				System.out.println(i+"/"+(k+1-i));
			}
		}
	}
}



你可能感兴趣的:(Cantor的数表)