题目描述
现代数学的著名证明之一是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项
输入输出样例
输入样例#1:
7
输出样例#1:
1/4
思路:
这是一道相对简单的题目(虽然叫boss战),显然表格是一个长方形的,但由于读取的方式是Z字形的,所以可以把它看成一个三角形的表格:
1/1
1/2 2/1
3/1 2/2 1/3
1/4 2/3 3/2 4/1
这样一看,问题就变得更简单了!就是求这个三角形表格的正常顺序的第m个数字。一眼看出通过观察得到第k行中的任意一个分数的分子和分母之和为k+1,且偶数行第m个的分子就是m,奇数行第m个分数的分母就是m。
问题解决。
代码:
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
int k=1,n;
scanf("%d",&n);
while(n-k>0)//循环得到t和m
{
n-=k;//第k行有k个数字,所以减去k
k++;//k自增
}
if(k%2==0)printf("%d/%d",n,k+1-n);//若为偶数
else printf("%d/%d",k+1-n,n);//若为奇数
return 0;
}