题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1/11/1 , 1/21/2 , 1/31/3 , 1/41/4, 1/51/5, …
2/12/1, 2/22/2 , 2/32/3, 2/42/4, …
3/13/1 , 3/23/2, 3/33/3, …
4/14/1, 4/24/2, …
5/15/1, …
…
我们以 Z 字形给上表的每一项编号。第一项是 1/11/1,然后是 1/21/2,2/12/1,3/13/1,2/22/2,…
输入格式
整数NN(1 \leq N \leq 10^71≤N≤107)。
输出格式
表中的第 NN 项。
输入输出样例
输入 #1复制
7
输出 #1复制
1/4
嘿嘿这是我自己的思路 :我觉得还好
#include<bits/stdc++.h> //
using namespace std; //
//和为2的有1个
//和为3的有2个 以此类推。。。。
//和为单数从上往下
//和为双数从下往上
int main()
{
int n,nn,ans = 0,d,s;
cin>>n;
for(int i = 1; i <= 1000005; i++)
{
nn = ans;//保存上一斜列的数目
ans+=i;
if(ans>=n)
{
d = i+1;//在和为d的这一斜列
break;
}
}
s = n-nn; //算出在这一列的第几位;
if(d&1)//列数是单数
printf("%d/%d",s,d-s);
else
printf("%d/%d",d-s,s);
return 0;
}