P1014 [NOIP1999 普及组] Cantor 表

https://www.luogu.com.cn/problem/P1014

思路

首先理解题目主意:输入n,代表第几项,输出那一项的值
既然以Z字形编号,那我把每行按Z字形写开

第一行: 1/1
第二行: 1/2 2/1
第三行: 3/1 2/2 1/3
第四行: 1/4 2/3 3/2 4/1

根据列举,可以发现一些规律。
每行个数随着行数增加。
分子+分母 = 行数 + 1
偶数行 分子 1 —2 分母 2 - 1
奇数行 分子 2 —1 分母 1 - 3

解题思路

求n是什么值,首先要确定他在哪一行,然后在确定是奇数行还是偶数行,根据减完后的第几个,知道其中一个分子分母的值,
在根据行数-1,可求出另一个。

补充:

确定哪一行:n 减去每行增加的个数,剩余的就是那行所在的第几个(因为n也是每行增加来的)
举例n = 7 n - 1 = 6 n - 2 = 4 n - 3 = 1 那层数就是4 那行的分子就是1的值

总结:

这种题不需要再程序中把数据建好,要根据已给的数据找到规律, 在程序中表现出来。

#include<stdio.h>
int main()
{
	int n,h = 1;//h表示在第几行
	scanf("%d",&n);
	while(n>h) //找出在哪行 
	{
		n = n-h;
		h++;
	}
//	printf("n = %d,h = %d\n",n,h); 
	if(h % 2 == 0) //判断奇偶行 
	{
		printf("%d/%d",n,h+1-n);
	}
	if(h % 2 == 1)
	{
		printf("%d/%d",h+1-n,n);
	}
	
	return 0;
} 
上一篇:G1 垃圾回收器学习


下一篇:Cantor表