题目描述 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
见描述
思路 模拟+统计
1 #include<cmath> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 int re(int a,int b) 9 { 10 cout<<a<<'/'<<b<<endl; 11 return 0; 12 } 13 int main() 14 { 15 int n; 16 cin>>n; 17 int x=1,i=1,j=1; 18 bool I=1,J=1; 19 while(1<2) 20 { 21 if(i==1) 22 { 23 if(I) 24 { 25 if(x==n) 26 { 27 re(i,j); 28 return 0; 29 } 30 j++; 31 x++; 32 } 33 else while(j>=2) 34 { 35 if(x==n) 36 { 37 re(i,j); 38 return 0; 39 } 40 i++; 41 j--; 42 x++; 43 } 44 I=!I; 45 } 46 else if(j==1&&i!=1) 47 { 48 if(J) 49 { 50 if(x==n) 51 { 52 re(i,j); 53 return 0; 54 } 55 i++; 56 x++; 57 } 58 else while(i>=2) 59 { 60 if(x==n) 61 { 62 re(i,j); 63 return 0; 64 } 65 i--; 66 j++; 67 x++; 68 } 69 J=!J; 70 } 71 } 72 cout<<i<<'/'<<j<<endl; 73 return 0; 74 }