题目如下
题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
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 | ...... | ||||
...... |
我们以 Z 字形给上表的每一项编号。第一项是 1/11/1,然后是 1/21/2,2/12/1,3/13/1,2/22/2,…
输入格式
整数N (1 <= N <= 10^7)
输出格式
表中的第 NN 项。
输入输出样例
输入: 7 输出:1/4
思路:掌握规律
AC代码如下:
#include <iostream>
using namespace std;
int main(){
int N; // N 为表中的第N项
int a = 0; // a 为第N项所在的层数
int b = 0; // b 为第一层到第a层所有的数的个数
int d; // d 为第N项离补满第a层差多少
cin >> N;
for (int i = 1;i < 10000000;i++){
b = b + i;
a = a + 1;
if(b <= N){
if(b == N){
d = 0;
break;
}
}
if(b > N){
d = b - N;
break;
}
}
if(a%2 == 0){
cout << (a-d) << "/" << (d+1) << endl;
}else{
cout << (d+1) << "/" << (a-d) << endl;
}
return 0;
}