1.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,输出第N项的数
求解思路:
当我们发现规律不容易找出来时,不妨按照编号把Cantor表多打一点:
1/1
1/2 2/1
3/1 2/2 1/3
1/4 2/3 3/2 4/1
5/1 4/2 3/3 2/4 1/5
1/6 2/5 3/4 4/3 5/2 6/1…
这样我们就容易发现规律:
每一行的数的个数就是该行的行数;
当行数为奇数时,第一个数的分子是该行的行数,分母是1,然后分子逐个减1,分母逐个加1;
当行数为偶数时,第一个数的分母是该行的行数,分子是1,然后分母逐个减1,分子逐个加1;
#include<stdio.h>
int main()
{
int n, m, a, b, i, s=0;
scanf( "%d", &n );//输入n//
for( i = 1; ;i++ )//用for循环判断n在哪一行//
{
a = i + 1;
s = s + i;
if( n >= s && (n-s)<=a )
{
break;
}
else
{
continue;
}
}
b = n - s;//用b来计算分子和分母//
if( a == 2 && b == 0 )//n在第一行时输出1//
{
m = 1;
printf("%d",m);
}
else if( a == 2 && b != 0 )//n在第二行时输出//
{
printf( "%d/%d", b, a-b+1);
}
else if( a % 2 == 0 && a > 2 )//n在偶数行时的输出//
{
printf