洛谷P1014 Cantor表
题目描述
现代数学的著名证明之一是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
/*原始状态
1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4 2/5
3/1 3/2 3/3 3/4 3/5
4/1 4/2 4/3 4/4 4/5
5/1
排序过后
1/1 1/2 2/1 3/1 2/2 1/3 1/4 2/3 3/2 4/1 4/2 3/3 2/4 1/5
1 2 3 4 5 6 7 8 9 10 11 12 13 14
规律如下
2=1+1 1/1 第一行,一个数字,1/1
3=1+2=2+1 1/2 2/1 第二行,两个数字,分子由1开始,分母由2开始
4=3+1=2+2=1+3 3/1 2/2 1/3 第三行,三个数字,分子由3开始,分母由1开始
5=1+4=2+3=3+2=4+1 1/4 2/3 3/2 4/1 第四行,四个数字,分子由1开始,分母由4开始
6=5+1=4+2=3+3=2+4=1+5 5/1 4/2 3/3 2/2 1/5 第五行, 五个数字,分子由5开始,分母由1开始
由图可知,奇数行时分子由行数开始递减,分母由行数开始递增,偶数行反之,数字所在行数可用for循环判断
n=n-i,当n<i+1时,代表是第i行*/
#include<stdio.h>
int main()
{
int n, y=1, z, i;
scanf("%d",&n);
for(i=1;n>=i+1;i++)
{
n=n-i;
}
z=i-1;
if((z-1)%2!=0)
{
for(int x=n;x>1;x--)
{
i--;
y++;
}
printf("%d/%d",i,y);
}
if((z-1)%2==0)
{
for(int x=n;x>1;x--)
{
i--;
y++;
}
printf("%d/%d",y,i);
}
return 0;
}