P1014 [NOIP1999普及グループ]カンターテーブル

タイトル説明
現代数学の有名な証明の1つは、有理数が列挙可能であるというゲオルクカントールの証明です。彼はこの命題を証明するために次の表を使用しました。
ここに画像の説明を挿入します

上記の表の各項目には、ジグザグの番号が付けられています。最初の項目は1/11/1、次に1 / 2、2 / 1、3 / 1、2 / 2、...です。

入力形式
整数N(1 <= N <= 10 ^ 7)。

出力形式
テーブルのN番目の項目。

入力サンプル

7

サンプル出力

4/1

シミュレーション+法則を見つけ、ラベル付けの順序で対角線部分を描くだけです。1/ 1自体が最初の対角線で、合計1つの数字です。2つの数字1/2と2/1は2番目の対角線で、合計2つの数字があります。3 / 1,2 / 2,1 / 3は3番目の対角線で、合計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