题目描述
现代数学的著名证明之一是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

京公网安备 11010502036488号