一、算法分析
可以把cantor表按照从左上到右下进行分层,然后分析出本题的答案与“层数”有关,只要求得层数和该数位于该层的第几个即可。层数的计算可以根据1~n累加等于(1+n)*n/2,然后列一元二次方程计算。
二、代码及注释
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
int k;
int main(){
scanf("%d",&n);
k=((sqrt(1+8.0*n)-1)/2); //这种涉及分层的,一定要先求层数
if(((2*k+1)*(2*k+1)-1)/8!=n) k++; //这种涉及整除和不整除不一样的情况下,对边界特判就行
int cnt=n-(k-1)*k/2; //分母是该层从下往上数第几个,分子是从上往下数第几个
printf("%d/%d",k-cnt+1,cnt);
return 0;
}