【算法分析】
● 首先将 Z 字形的 Cantor 表拉伸为线性。通过观察线性的 Cantor 表,会发现第 i 段有 i 个“分母+分子”的和为 i+1 的分数。这是本题代码编写的重要出发点。
● 由于本题有 10^7 个数据,并依据上文所言“第 i 段有 i 个‘分母+分子’的和为 i+1 的分数”的结论,可设所有数据分为 x 段。其中,x 满足 1+2+3+……+x=10^7,等价于 x(x+1)/2=10^7,即 x 约取到 10^4,也即所有数据约划分为 10^4 段。
● 输出是分数的形式,所以需要以字符的形式输出除号。同时一定要注意偶数段、奇数段各个分数的形式。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
int cnt=0;
int main() {
int n;
cin>>n;
for(int i=1; i<=10000; i++) {
for(int j=i; j>=1; j--) {
cnt++;
if(cnt==n && i%2!=0) cout<<j<<"/"<<(i+1-j)<<endl;
else if(cnt==n && i%2==0) cout<<(i+1-j)<<"/"<<j<<endl;
}
}
return 0;
}
/*
in:7
out:1/4
*/