時間限制:1s 空間限制:128000KB 題目等級:白銀silver
題目描述 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)
範例輸出 Sample Output 1/4
類比思想:沿圖示軌跡斜著看,左上方部分,前 i 個斜行有1+2+...+i 項(即i*(i+1)/2),以此判斷第n項在第幾斜行。再根據奇數斜行從左下到右上、偶數斜行從右上到左下,判斷出第n項在該斜行的什麼位置,然後就可以推斷出第n項的數值。
#include <iostream>#include <math.h>using namespace std;int main(){ int n; cin>>n; /*找出第n項所在的“斜行”*/ int i=0; while( 1 ) { i++; if( i*(i+1)>=2*n ) break; } /* 1.第n項恰好是第i斜行的端點 */ if( i*(i+1)==2*n ) { if( i%2==1 ) { cout<<"1/"<<i<<endl; return 0; } else { cout<<i<<"/1"<<endl; return 0; } } /* 2.第n項在第i斜行的內部 */ else { int d=i*(i+1)/2-n; //d是n與斜行端點的差值(可理解為“第n項離斜行末的距離”) if( i%2==1 ) { cout<<1+d<<"/"<<i-d<<endl; //奇數斜行分母從1加到i,分子從i減到1 } else { cout<<i-d<<"/"<<1+d<<endl; //偶數斜行分子從1加到i,分母從i減到1 } } return 0;}