luogu1014 Cantor表(NOIP1999普及组第1题)
时空限制 1000ms/128MB
题目描述
现代数学的著名证明之一是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,…
输入
整数N(1≤N≤10000000)。
输出
表中的第N项。
输入样例
7
输出样例
1/4
分析
先找到第n项所处的斜线,也就是第几斜线。
while (sum<n) sum+=++i; 代码结束,i就是第n项所在的斜线,sum就是1~i行所有个数之和。接下来,注意观察,以奇数行为例:奇数行分母递增,分子递减(偶数行反之),那么就是要找到第n项所在这一行的分子分母就OK了。
sum把第i行都加了,sum-n就是i行末至第n项中间有几个数,分子在此基础上+1,也就是sum-n+1,分母分子之和为i+1,所以分母为i+1-(sum-n+1)--->i-(sum-n);
代码
#include<iostream>
using namespace std;
int main(){
int n,i=0,sum=0;
cin>>n;
while (sum<n) sum+=++i;
if (i%2) cout<<sum-n+1<<"/"<<i-(sum-n)<<endl;
else cout<<i-(sum-n)<<"/"<<sum-n+1<<endl;
return 0;
}