Cantor表(刷题)(C语言)

个人博客主页:https://blog.csdn.net/2301_79293429?type=blog
专栏:https://blog.csdn.net/2301_79293429/category_12545690.html

题目描述

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

Cantor表(刷题)(C语言)_第1张图片

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

输入格式

整数N(1≤N≤10^7)。

输出格式

表中的第 N 项。

输入输出样例

输入 

7

输出 

1/4

题目链接: 记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目分析:

将题目中的图像写为易观察的形式:

/*        1/1

        1/2   2/1

   3/1     2/2    1/3  

设最上面一行为第1行,本题用i表示,

第i行的分子分母之和为i+1,除了第一行,偶数行的分子从1开始,奇数行从i开始

*/

AC代码:

int main()
{
    int n;
    scanf("%d", &n);
    if (n == 1)
        printf("1/1");
    else
    {
        int i = 0, j = 1, sum = 0;
        for (i = 1;; i++)
        {
            sum += j++;
            if (sum >= n)
                break;
        }

        sum -= i;/*前面几行的总个数*/
        if (i % 2 == 1)/*奇数行*/
        {
            j = 0;
            if (sum == n - 1)
                printf("%d/%d", i, 1);
            else
            {
                int h = i - (n - sum) + 1;/*分子*/
                i = n - sum;/*分母*/
                printf("%d/%d", h, i);
            }
        }
        else
        {
            j = 0;
            if (sum == n - 1)
                printf("%d/%d", 1, i);
            else
            {
                int h = i - (n - sum) + 1;/*分母*/
                i = n - sum;/*分子*/
                printf("%d/%d", i, h);
            }
        }
    }
    return 0;
}

祝大家题题AC啦,天天只想做个WA梦~

Cantor表(刷题)(C语言)_第2张图片

你可能感兴趣的:(刷题,算法,c语言)