1. 程式人生 > >codeVS之旅:1083 Cantor表

codeVS之旅:1083 Cantor表

題目描述 Description

現代數學的著名證明之一是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,…

輸入描述 Input Description

整數N(1≤N≤10000000)

輸出描述 Output Description

表中的第N項

樣例輸入 Sample Input

7

樣例輸出 Sample Output

1/4

資料範圍及提示 Data Size & Hint

見描述

 

思路:首先我先貼出程式碼,這個是我參考後面題解寫的一個:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int i,n;
    cin>>n;
    for(i=1;i<n;i++)
    {
        n = n - i;
    }
    if(i%2==0)
        printf("%d/%d",n,i+1-n);
    else
        printf("%d/%d",i+1-n,n);
    return 0;
}

那麼這個程式碼如何理解呢?

首先n = n-i,同時i每次迴圈都在加一,這個的解釋是:我們在減去這個數字所在層的上面所有層,注意這裡的層是斜著的。而這一層這個數所處的位置,恰好與n有關,區別只是前面減去的層數是奇數還是偶數,奇數的話n代表分子,i+1代表i+1層,i+1-n代表分母,因為每一層分子與分母相加減一等於層數。這就是這個題的解法。