洛谷P1014 Cantor表

洛谷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; 
 } 

猜你喜欢

转载自blog.csdn.net/w__000000wbt/article/details/83714994