P1014 [NOIP1999 普及组] Cantor 表

题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
在这里插入图片描述

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

输入格式
整数N(1 <= N <= 10^7)。

输出格式
表中的第 N 项。

输入样例

7

输出样例

4/1

模拟+找规律即可,按标号顺序只画出对角线部分,1/1自己是第一个对角线,共1个数。1/2,2/1两数是第二条对角线,共两个数。3/1,2/2,1/3是第三条对角线,共三个数……第几条对角线就有几个数。奇数条是从右上到左下,偶数条是从左下到右上。当确定是第几条对角线后,开始寻找是这一条的第几个数(从1开始标号),分子和分母相加有规律,分子加1,分母相应减1,和为对角线数(该条对角线上数字的个数)+1
#include <iostream>
using namespace std;

int main() {
    
    
    int n;
    cin >> n;
    long long sum = 0;
    for (int i = 1;; i++) {
    
    
        sum += i;
        if (sum == n) {
    
    
            if (i % 2 == 0)
                cout << i << "/1";
            else
                cout << "1/" << i;
            break;
        } else if (sum > n) {
    
    
            int j = i - 1;
            sum -= i;
            int diff = n - sum;
            if (j % 2 == 1) {
    
    
                cout << diff << "/" << i + 1 - diff;
            } else {
    
    
                cout << i + 1 - diff << "/" << diff;
            }
            break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/112971529