题目描述 Description
现代数学的著名证明之一是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,…
样例输入
7
样例输出
1/4
代码段:
#include <stdio.h>
int main()
{
int n, i;
scanf("%d", &n);
for (i = 1; n - i > 0; i++)
{
n -= i;
}
if (i % 2 == 0)
printf("%d/%d", n, i + 1 - n);
else
printf("%d/%d", i + 1 - n, n);
return 0;
}
思路理解:
1.整体思路是先找出在第几斜行,然后找出在该行的第几个元素位置上
2.关于找准位置:
i表示的是斜行,最左上角为第一斜行,n为输入的数字
比较i和n的关系,
等到n小于i的时候,表示这个元素在第i斜行里,
(因为前面每一次比较时,n都是减去了第i行的i个元素,
也就是说,等到n小于i的时候就是n被定位到了i斜行里)
3.找到位置之后要注意,奇数行是左下往右上走,偶数行相反,
因此 奇数行输出为n和i+1-n,
偶数行反过来,为 i+1-n和n
(这里的i+1-n是由观察得来的,第i斜行的/前后的两个数加起来的值为i+1,因此得到如上结果。)