首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用C语言证明Georg Cantor解决方案

2012-03-02 
用C语言证明Georg Cantor现代数学的著名证明之一是GeorgCantor证明了有理数是可枚举的。他是用下面一张表来

用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;
}

热点排行