算法學習-題目-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;
}

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