题目描述
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,…
![](http://codevs.cn/media/image/problem/1083.png)
输入描述
Input Description
整数N(1≤N≤10000000)
输出描述
Output Description
表中的第N项
样例输入
Sample Input
7
样例输出
Sample Output
1/4
#include<iostream>//找出第n个元素所在的斜行以及所在斜行的第几个位置,奇数行和偶数行不一样
using namespace std;
int main()
{
int n,i=0,k,m=0;
cin>>n;
while(n>m)
{
i++;
m+=i;
} //i为n所在的斜行,
k=n-i*(i-1)/2; //k为第i行第k个元素
if(i%2==0) //n在偶数行
cout<<k<<'/'<<i-k+1;
else cout<<i-k+1<<'/'<<k;
return 0;
}
这个题真是... 唉... 对于找规律的题真的是头疼,最难得地方就在于很难找规律,到最后我也没发现规律是什么,所以就借鉴了别人的代码,如上述,这个代码是别人写的,的确不是我写的,我只是看明白了而已....留作一种题型吧,以后遇到类似的可以考虑一下。
#include<iostream>//找出第n个元素所在的斜行以及所在斜行的第几个位置,奇数行和偶数行不一样
using namespace std;
int main()
{
int n,i=0,k,m=0;
cin>>n;
while(n>m)
{
i++;
m+=i;
} //i为n所在的斜行,
k=n-i*(i-1)/2; //k为第i行第k个元素
if(i%2==0) //n在偶数行
cout<<k<<'/'<<i-k+1;
else cout<<i-k+1<<'/'<<k;
return 0;
}