当前位置: 代码迷 >> 综合 >> [NOIP1999]Cantor表
  详细解决方案

[NOIP1999]Cantor表

热度:52   发布时间:2023-12-06 13:00:27.0


 

代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

 我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…

输入描述:

整数N(1≤N≤10000000)

输出描述:

表中的第N项

示例1

输入

复制7

7

输出

复制1/4

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