网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
目录
-------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
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, …
…
我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…
-------------------------------------------------------------------------------------------------------------------------------
输入格式
整数N(1≤N≤107)。
-------------------------------------------------------------------------------------------------------------------------------
输出格式
表中的第 N 项。
-------------------------------------------------------------------------------------------------------------------------------
输入输出样例
输入 #1
7
输出 #1
1/4
-------------------------------------------------------------------------------------------------------------------------------
解析:
update:显然这样的程序并不是最短的,评论已经有很多的dalaodalao指出了,而且时间复杂度也并不优秀,但是当时就会有一种莫名的自信 至于怎么压行,评论区也说得比较明白了,所以评论不用再提供压行思路了
update: 首先我们观察到第ii行,第jj列的数就是i/ji/j,这是第一个要发现的。
因为题目中要求是以Z字型编号
我们看题目中的表是:
1/1,1/2,1/3 ……
2/1,2/2,2/3 ……
Z字型编号以后(把头向左偏45度):
第一行:1/1 (1号)
第二行:1/2 (2号) 2/1(3号)
第三行:1/3 (6号) 2/2**(5号)** 3/1**(4号)**
\uparrow↑ 观察法易得每一行比上一行多1
代码里那个while循环,就是为了通过循环枚举,判断它在编号之后的第几行,第几个位置。
(这个优化有没有都可以AC本题,但是评论指出我的时间复杂度不够优秀,因此提一提这个优化,不愿意看的可以直接略过看下一个分割线以后的内容。)
但其实可以直接出结论优化时间复杂度从O(n)优化到O(1),这样就要考虑到等差数列求和
公式:S=2n(an+a1)
所以,很显然Z字型排序之后,第k行的数编号n满足:
-------------------------------------------------------------------------------------------------------------------------------
C++源码:
#include<cstdio>
int main()
{
int n;scanf("%d",&n);
int t=1,ans=0;//t是表示下一次跳到下一次的距离,ans是表示第几层
while(1)
{
if(n>t){n-=t;ans++;t++;}//printf("%d\n",ans);
else if(n==t&&ans%2==0){printf("1/%d",ans+1);break;}
//如果在n==t,并且为偶数层,就在第一行 第ans+1个
![img](https://img-blog.csdnimg.cn/img_convert/2847055074238885e8ddcc81da624eb6.png)
![img](https://img-blog.csdnimg.cn/img_convert/25c6b7ed0dc8a69b1f23301c93c8e31f.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
642)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**