用C语言证明Georg 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、1/3、1/4、2/3……。编程输入项号N(1 <=N <=1000000),输出表中第N项。
例:输入:N=7
输出:1/4
[解决办法]
#include <stdio.h>
#include <math.h>
typedef unsigned long ul;
void slove( ul N )
{
ul a = (ul)(sqrt(8*N+1)-1)/2 ,
b = N - a * (a+1) / 2;
printf( "%lu : %lu/%lu\n " , N ,
!b?(a&1?1:a):(a&1?b:a+2-b) ,
!b?(a&1?a:1):(a&1?a+2-b:b) );
}
int main()
{
ul N ;
while( 1 == ( scanf( "%lu " , &N ) ) && N > = 1 )
slove( N );
return 0;
}