学习目标:Java算法学习-Day6
**题库:洛谷题库 **
每天保持发布一篇Java或C算法题解!
题目:现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1/11/1 , 1/21/2 , 1/31/3 , 1/41/4, 1/51/5, …
2/12/1, 2/22/2 , 2/32/3, 2/42/4, …
3/13/1 , 3/23/2, 3/33/3, …
4/14/1, 4/24/2, …
5/15/1, …
…
我们以 Z 字形给上表的每一项编号。第一项是 1/11/1,然后是 1/21/2,2/12/1,3/13/1,2/22/2,…
输入格式:
整数NN(1 \leq N \leq 10^71≤N≤10
输出格式:
表中的第 N 项。
样例 1 :
输入:
7
输出:
1/4
思路:
主要是递归的思想,当然这题有很多方法解,由于数据结构看的有点慢,递归还没学习到,所以看了网上大佬们的题解
选了一种方法进行解题。
Z字形,斜着看,有点像金字塔
习题总结及反思:
Cantor表挺有意思,写文章的前一天晚上熬到了凌晨2点,都在研究这东西。导致后一天人直接麻了,状态不佳。
Cantor表的解法很多,以后算法学的多了,便再回到Cantor表!
代码如下:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int c = sc.nextInt();
int count[] = new int[c];
//第一个数
int x = 1,y = 1;
//向下走
boolean downFlag = false;
//向右走
boolean rightFlag = false;
for(int i = 0;i<count.length;i++){
count[i] = sc.nextInt();
}
for(int i = 0;i<count.length ;i++){
//从第一个数开始
x = y = 1;
for(int j = 2;j<=count[i];j++){
//判断在哪一行
//类似于1/2的数
if(x == 1&&y % 2!=0){
y = y + 1;
//开始向右上走
rightFlag = true;
downFlag = false;
}
//类似于2/1的数
else if(x % 2==0&&y==1){
x = x + 1;
//往左下走
downFlag = true;
rightFlag = false;
}
//往右上
else if(rightFlag){
x = x + 1;
y = y - 1;
}
//往左下
else if(downFlag){
x = x - 1;
y = y + 1;
}
}
System.out.println(x + "/" + y);
}
}
}