题目描述
现代数学的著名证明之一是 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;
}