题目描述
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
输入描述:
整数
输出描述:
表中的第N项
示例1
输入
7
输出
1/4
解答
一道简单的题目,找规律即可解出。
先上代码
#include <iostream> using namespace std; int main() { int n,sum=0,i=0; cin >>n; while(sum<n) { i++; sum+=i; } if(i%2==0) { cout <<n-sum+i<<"/"<<i+1-(n-sum+i); } else cout <<i+1-(n-sum+i)<<"/"<<n-sum+i; return 0; }解释: 我们可以用一个循环得出第n个数所在的行数,以及到该行最多数的个数。
while(sum<n) { i++; sum+=i; }
sum为该行最多数的个数,i为第n个数所在的行数。
e.g.:
发现了什么规律?
分子分母之和等于i+1
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 …
且
当时,该数在第4(斜)行,的第1位,
用式子表示:位。
又第i行,分子分母之和等于i+1
这下简单咯,当i为偶数时,分子从1递增到i,步长为1;分母从i递减到1,步长为1
反之亦反之╰( ̄ω ̄o)
∴
if(i%2==0) { cout <<n-sum+i<<"/"<<i+1-(n-sum+i); } else cout <<i+1-(n-sum+i)<<"/"<<n-sum+i;
来源:荧焤's Blog