【洛谷每日一题】P1014 [NOIP1999 普及组] Cantor 表

[NOIP1999 普及组] Cantor 表

题目描述

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

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

输入格式

整数 N N N 1 ≤ N ≤ 1 0 7 1 \leq N \leq 10^7 1N107)。

输出格式

表中的第 N N N 项。

样例 #1

样例输入 #1

7

样例输出 #1

1/4

答案

#include <stdio.h>

int main(void)
{
    int n = 0, k = 1; // n 代表编号,k 代表行数(第 k 行有 k 个数)

    scanf("%d", &n);
    while (n > k) // 如 n > k,减去每行的个数
    {
        n -= k; // 减去之前每行的数,最终 n 就会等于在该行中的序号(如从左到右第几个)
        ++k;    // 行数加 1
    }
    if (k % 2 == 0) // 如果行数是偶数行,则数是从右向左数的
        printf("%d/%d\n", n, (k + 1 - n));
    // 此时 n 的含义就是从右向左第几个,在该种情况下,分子就是 n,而分母等于k + 1 - n
    else // 如果行数是奇数行,则数是从左向右数的
        printf("%d/%d\n", k + 1 - n, n);
    // 此时 n 的含义就是从左向右第几个,在该种情况下,分母就是 n,而分子等于 k + 1 - n

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值