Cantor表
2026-05-21 15:22:29
发布于:北京
4阅读
0回复
0点赞
康托表(Cantor 表),是数学家康托尔用来证明正有理数可枚举的一种排列方式。
康托表:
把所有正有理数写成 分子/分母,按下面无限表格排布:

行:分子固定,分母递增
列:分母固定,分子递增
Z 字形(对角线)遍历编号
康托用沿对角线 Z 字形把它们排成一列,不重不漏:
第 1 项:1/1
第 2 项:1/2
第 3 项:2/1
第 4 项:3/1
第 5 项:2/2
第 6 项:1/3
第 7 项:1/4
第 8 项:2/3
第 9 项:3/2
第 10 项:4/1
…

//不能直接使用二维数组存储Cantor表,n太大,存储空间会不足
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k;
cin>>n;
//k*(k+1)/2<=n; k*(k+1)/2:前k行的式子数量,找满足这个条件的k,直接定位
k=sqrt(2*n);
while(k*(k+1)<=2*n) k++;
if(k*(k-1)==2*n) { //第n个是某行的最后一个
k--;
if(k%2==0) cout<<k<<"/"<<1<<endl; //偶数行,从右往左,分子逐渐变大,分母逐渐变小
else cout<<1<<"/"<<k<<endl; //奇数行,从左往右,分子逐渐变小,分母逐渐变大
} else {
int num=k*(k-1)/2;
int i=n-num;
if(k%2==0) cout<<i<<"/"<<k+1-i<<endl; //偶数行,从右往左,分子逐渐变大,分母逐渐变小
else cout<<k+1-i<<"/"<<i<<endl; //奇数行,从左往右,分子逐渐变小,分母逐渐变大
}
return 0;
}
这里空空如也







有帮助,赞一个