洛谷——P1014 [NOIP1999 普及组] Cantor 表

古城微笑少年丶 2023-10-02 11:02 108阅读 0赞

P1014 [NOIP1999 普及组] Cantor 表

题目描述

现代数学的著名证明之一是 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≤107)。

输出格式

表中的第 NN 项。

输入输出样例

输入 #1复制

  1. 7

输出 #1复制

  1. 1/4

c++实现:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,h,k,sum=0;//第n项是第h行的第k个数,前h-1行共有sum个数
  4. int main(){
  5. /*
  6. 1/1
  7. 1/2 2/1
  8. 3/1 2/2 1/3
  9. 1/4 2/3 3/2 4/1
  10. 5/1 4/2 3/3 2/4 1/5
  11. 第n行有n个数
  12. 分子+分母=n+1
  13. 分母=n+1-分母
  14. 偶数的时候 分子 递增
  15. 奇数的时候 分子 递减
  16. 若n=13
  17. 1+2+3+4 = 10 3
  18. 则第n项是第5行的第3个数
  19. */
  20. cin>>n;
  21. //求出第n项是第几行的第几个数
  22. for(int i=1;;i++){
  23. sum+=i; //第几行 就有几个数
  24. if(n<=sum) { //当第n项小于等于sum的时候
  25. h=i; //这时 令行数 h=i
  26. sum-=i; //要数前i共有多少个数,即前h-1行共有sum个数
  27. k=n-sum;//这时 第h行的第k个数=h(前i行的所有个数)-sum(前h-1行共有sum个数)
  28. break;
  29. }
  30. }
  31. //奇 偶 判断
  32. if(h%2==0){
  33. //第n行有n个数
  34. //分子+分母=n+1
  35. //分母=n+1-分母
  36. cout<<k<<'/'<<(h+1-k);
  37. //分母=h( 第n行有n个数)+1-k(分子)
  38. }else{
  39. cout<<(h+1-k)<<'/'<<k;
  40. }
  41. return 0;
  42. }

发表评论

表情:
评论列表 (有 0 条评论,108人围观)

还没有评论,来说两句吧...

相关阅读

    相关 P1014 Cantor

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2

    相关 P1014 Cantor

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1