P1014 [NOIP1999 普及组] Cantor 表

本文介绍了一个基于Cantor证明有理数可枚举性的算法,通过Z字形编号法,将原表转换为新的排列方式,用于找到给定整数N在重新编排后的表格中的位置。
摘要由CSDN通过智能技术生成

题目描述

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…

输入格式

整数N(1≤N≤107)。

输出格式

表中的第 N 项。

输入输出样例

输入 #1复制

7

输出 #1复制

1/4

思路:原版表  1/1 1/2 1/3 1/4 1/5 1/6......

                        2/1 2/2 2/3 2/4 2/5......

                        ...... ....... ...... 

Cantor 改表后  1/1

                         1/2 2/1

                         1/3 2/2 3/1

                         ...... ...... ......

观察发现:原版表都是i/j,改版后是吧原版表竖过来看

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,i=1,k=0,x=0,y=0;
    cin>>n;
    while(i<n){
        n=n-i;
        i++;
    }                        //此时的n就是这个数所在的行
    k=n-1;                   //和第一行之间的 
    if(i%2==0) x=1+k,y=i-k;  //如果是偶数行,那书的顺序不变
    else x=i-k,y=1+k;        //如果是奇数行,那书的顺序相反
    cout<<x<<"/"<<y;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值