洛谷P1014 Cantor表

題目描述現代數學的著名證明之一是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≤10000000)
輸出格式:
表中的第N項

輸入輸出樣例
輸入樣例#1:
7
輸出樣例#1:
1/4

模擬了半天才發現沒必要遞歸,寫的有些麻煩了。

#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a = 1, b = 1, cnt = 1, c = 1;//a爲分子,b爲分母,cnt記錄層數,c爲編號
int main()
{
 cin >> n;
 while(1)
 {
  if (c == n)//編號和n相等時輸出
  {
   cout << a << "/" << b << endl;
   break;
  }
    if (a == 1)//如果到達第一行邊界處
  {
   if (b % 2)//如果是奇數列
    b++, cnt++, c++;//向下走,層數加一
   else
    a++, b--, c++;//否則向左下方走
  }
  else if (b == 1)//若到達第一列邊界處
  {
   if (a % 2)//如果行是奇數行
    a--, b++, c++;//向右上方走
   else
    a++, cnt++, c++;//否則向右走,層數加一
  }
  else if (cnt % 2)//如果不在邊界處,若層數爲奇數
  {
   a--, b++, c++;//向右上方走
  }
  else
   a++, b--, c++;//否則向左下方走
 }
 //system("pause");
 return 0;
}

大佬的簡便方法:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
 int n, cnt = 0, sum = 0;//cnt計算行層,sum計算每行結束時編號最大的值
 cin >> n;
 while (sum < n)//編號沒到n時繼續
 {
  cnt++;//層數加一
  sum += cnt;//每層編號最大值加層數
 }
 if (cnt % 2)//奇數層
  cout << sum - n + 1 << "/" << cnt - sum + n << endl; //最大值-n+1  /  層數-最大值+n
 else//偶數層
  cout << cnt - sum + n << "/" << sum - n + 1 << endl;//反過來
 //system("pause");
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章