题目描述

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

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

输入描述:

整数

输出描述:

表中的第N项

示例1

输入
7
输出
1/4

解答

一道简单的题目,找规律即可解出。
先上代码
#include <iostream>
using namespace std;
int main() {
    int n,sum=0,i=0;
    cin >>n;
    while(sum<n) {
        i++;
        sum+=i;
        }
    if(i%2==0) {
        cout <<n-sum+i<<"/"<<i+1-(n-sum+i);
        }
    else cout <<i+1-(n-sum+i)<<"/"<<n-sum+i;
    return 0;
    }
解释: 我们可以用一个循环得出第n个数所在的行数,以及到该行最多数的个数。
while(sum<n) {
        i++;
        sum+=i;
        }

sum为该行最多数的个数,i为第n个数所在的行数。

e.g.:

发现了什么规律?

分子分母之和等于i+1

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 …

时,该数在第4(斜)行,的第1位,

用式子表示:位。

又第i行,分子分母之和等于i+1

这下简单咯,当i为偶数时,分子从1递增到i,步长为1;分母从i递减到1,步长为1

反之亦反之╰( ̄ω ̄o)

 if(i%2==0) {
        cout <<n-sum+i<<"/"<<i+1-(n-sum+i);
        }
    else cout <<i+1-(n-sum+i)<<"/"<<n-sum+i;


来源:荧焤's Blog