题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1/11/1 , 1/21/2 , 1/31/3 , 1/41/4, 1/51/5, …
2/12/1, 2/22/2 , 2/32/3, 2/42/4, …
3/13/1 , 3/23/2, 3/33/3, …
4/14/1, 4/24/2, …
5/15/1, …
…
我们以 Z 字形给上表的每一项编号。第一项是 1/11/1,然后是 1/21/2,2/12/1,3/13/1,2/22/2,…
输入格式
整数NN(1 \leq N \leq 10^71≤N≤10
7
)。
输出格式
表中的第 NN 项。
输入输出样例
输入 #1复制
7
输出 #1复制
1/4
模拟过程法:
#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define Swap(a,b) {int temp=a;a=b;b=temp;}
using namespace std;
const int maxn = 10000007;
int a[maxn],b[maxn];//a,b数组分别存分子分母
using namespace std;
int main()
{
int n,i=1;//i判断行数
cin>>n;
int num=1;
while(num<=n) {
if(i%2!=0) {//z字型储存
for(int j=1;j<=i;j++) {
a[num]=i-j+1;
b[num]=j;
num++;
}
}
else {
for(int j=1;j<=i;j++) {
a[num]=j;
b[num]=i-j+1;
num++;
}
}
i++;//行数+1
}
cout<<a[n]<<"/"<<b[n]<<endl;
return 0;
}
公式法:
因为观察看得到每行分子分母和为行数+1,所以判断行数和所在行位置即可。
#define INF 0x3f3f3f3f
#define Swap(a,b) {int temp=a;a=b;b=temp;}
using namespace std;
const int maxn = 10000007;
int a[maxn],b[maxn];//a,b数组分别存分子分母
using namespace std;
int main()
{
int n,i=1;
cin>>n;
while(n>i) {
n=n-i;
i++;
}
if(i%2==0) cout<<n<<"/"<<i+1-n;//同样判断奇偶
else cout<<i+1-n<<"/"<<n;
return 0;
}