算法学习-题目-00-洛谷-P1014 Cantor表

算法学习-题目-00-洛谷-P1014 Cantor表-2020-5-17

一、题目

题目描述
现代数学的著名证明之一是 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,…

输入格式

整数N(1≤N≤107)。

输出格式

表中的第 N 项。

输入输出样例

输入

7

输出

1/4

二、题目分析

1/1 1/2 2/1 3/1 2/2 1/3 1/4 2/3 3/2 4/1 5/1 4/2 3/3 2/4 1/5 1/6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

在这里插入图片描述
1/1 -> 1/2 下加
1/2->2/1 上加下减
2/1->3/1 上加
3/1->2/2 上减下加
2/2->1/3 上减下加

1/3->1/4 下加
1/4->2/3 上加下减
2/3->3/2 上加下减
3/2->4/1 上加下减
4/1->5/1 上加
5/1->4/2 上减下加
4/2->3/3 上减下加
3/3->2/4 上减下加
2/4->1/5上减下加

1/5->1/6 下加

规律
1.分子为1,分母加1,只操作1次,不连续操作(即1/1->1/2,但1/2不会变成1/3)
2.分母为1,分子加1,只操作1次,不连续操作(即2/1->3/1,但3/1不会变成4/1)
3.完成1后到2过程,中都是上加下减(1,2过程只1,2规律,上加下减是分子加1,分母减一)
4完成2后到1过程,中都是上减下加(1,2过程只1,2规律,上减下加是分母加1,分子减一)

三、代码

#include<iostream>
/*
1.输入
2.处理
3.输出
*/ 
using namespace std;
int main() {
   int a,b,c,d,n;
   b=1;
   c=1;
   d=0;//0表示上为1,1表示下为1 
   n=0;//状态看是否第一次操作
    /*1*/
  	cin >>a;

    /*2*/
   for(int i=1;i<a;i++)
   {
   	if(b==1&&n==0){c++;d=0;n=1;continue;} 
   	if(c==1&&n==0){b++;d=1;n=1;continue;} 
   	if(d==0){b+=1;c-=1;n=0;continue;} 
   	if(d==1){b-=1;c+=1;n=0;continue;}
   	}
   /*3*/ 
   cout<<b<<"/"<<c;
   return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章