题目描述 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
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
#define MAX 11
#define PI 3.1415926
using namespace std;
const int maxn=10000;
int num[maxn];
int main()
{
int m,n,i;
cin>>n;
for(i = 0 ; i < maxn ; i++)
{
//num[i]的含义是第1到第i斜行的总个数。
for(int j = 0 ; j <= i ; j++){
num[i]+=j;
// printf("num[%d] is %d\n", i, num[i]);
}
if (num[i] >= n)
break;
}
//m指的是第n个元素是在第i行的位置
m = n-num[i-1];
//这里的i+1指的是每一斜行最大的元素+1或者说是第i行分子分母之和
if ( i%2==0)printf("%d/%d",m,i+1-m);
else printf("%d/%d",i+1-m,m);
return 0;
}