题目描述
如下数列,前5项分别是1/1,1/2,2/1,3/1,2/2……。输入n,输出第n项。
1/1
2/1
3/1
4/1
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));
}
}
}
}