codeVS之旅:1083 Cantor表
阿新 • • 發佈:2018-11-09
題目描述 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代表分母,因為每一層分子與分母相加減一等於層數。這就是這個題的解法。