算法篇——Cantor的数表

  来源:《算法竞赛入门经典》例题5.4.1

  题目:现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 第一项是1/1,第二项是是1/2,第三项是2/1,第四项是3/1,第五项是2/2,……。输入n,输出第n项。

    

  样例输入
  3
  14
  7
  12345
  样例输出
  2/1
  2/4
  1/4
  59/99

  分析

  数表提示我们按照斜线分类。第1条斜线有1个数,第2条有2个数,第3条有3个数……第k条有k个数。这样,前k条斜线一共有S=1+2+3+……+k个数。

  第n项在哪条斜线上呢?只要找到一个最小的k,使得S≥n,那么第n项就是第k条斜线上倒数第S-n+1个数(最后一个元素是倒数第1个元素,而不是倒数第0个元素)。

  而k的奇偶决定着第k条斜线上数的顺序:若k是奇数,第k条斜线上倒数第i个元素是i/(k+1-i);若k是偶数,第k条斜线上倒数第i个元素是(k+1-i)/i。

  源码

#include<stdio.h>

int main()
{
    int n,k,s;            //前k挑斜线一共s个数
    while(scanf("%d",&n) == 1)
    {
        k=0;
        s=0;
        while(s<n)        //找到最小的k使得s>=n
        {
            k++;
            s+=k;
        }
        if(k%2==1)        //k的奇偶决定着斜线上数的顺序,n是第k条斜线上倒数第s-n+1个数
            printf("%d/%d\n",s-n+1,k+n-s);    //若k是奇数,第k条斜线上倒数第i个元素是i/(k+1-i)
        else
            printf("%d/%d\n",k+n-s,s-n+1);    //若k是偶数,第k条斜线上倒数第i个元素是(k+1-i)/i
    }

    return 0;
}
时间: 2024-11-01 21:58:09

算法篇——Cantor的数表的相关文章

深度学习word2vec笔记之算法篇

深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料的时候,经常会被叫去看那几篇论文,而那几篇论文也没有系统地说明word2vec的具体原理和算法,所以老衲就斗胆整理了一个笔记,希望能帮助各位尽快理解word2vec的基本原理,避免浪费时间. 当然如果已经了解了,就随便看看得了. 一. CBOW加层次的网络结构与使用说明 Word2vec总共有两种类

插入排序——一步一步算法篇

插入排序 算法思想:将待排序的数据放在一个数组中,并设置一个中间量m,用来存储每次插入比较的元素. (1) a[1]自成1个有序区,无序区为a[2..n]; (2) 从i=2起直至i=n为止,将a[i]放在恰当的位置,使a[1..i]数据序列有序; ① m:=a[i]; ② 将m与前i-1个数比较 , j:=i-1; while(x #include<iostream> #include<cstdio> #include<cstring> #include<str

Cantor的数表 【找规律】

小俞同学,最近勤学苦练数学,对一种数表产生了兴趣. 数表如下: 1/1 1/2 1/3 1/4 1/5 2/1 2/2 2/3 2/4 3/1 3/2 3/3 4/1 4/2 5/1 她冥思苦相了好久,貌似摸到了一点规律,但是她不知道自己的规律找的对不对,所以需要你来写一个程序来判断. 输入格式 每行一个n(1<=n<232). 输出 对于输入的n,输出第n项. 第一项:1/1 第二项:1/2 第三项:  2/1 第四项:3/1 第五项:2/2. 样例输入 3 14 7 12345 样例输出

冒泡排序——一步一步算法篇

基本思想:依次比较相邻的两个数,并两两交换,使大(或小)的数不停向前推进,以此类推-- 由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序. #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int main() { int n,a[1000],i,j,k,m; cin>>n; memset(a,

算法篇——因子和阶乘

来源:<算法竞赛入门经典>例题5.4.2 题目:输入正整数n(2≤n≤100),把阶乘n!=1*2*3*...*n分解成素因子相乘的形式,从小到大输出各个素数(2.3.5...)的指数.例如,5! 表示为 3 1 1(5!=23*31*51=120),程序忽略比最大素因子更大的素数(否则末尾会有无穷多个0) 样例输入: 5 53 样例输出: 5! = 3 1 1 53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1 分析: 注意到n<=100,所以素因子也一定

有赞搜索引擎实践(算法篇)

## 1. 搜索算法总体架构 在上篇文章(工程篇)中, 我们介绍了有赞搜索引擎的基本框架. 搜索引擎主要3个部件构成. 第一, hadoop集群, 用于生成大规模搜索和实时索引; 第二,  ElasticSearch集群, 提供分布式搜索方案; 第三, 高级搜索集群, 用于提供商业搜索的特殊功能. 商业电商搜索由于搜索的特殊性, 独立的ElasticSearch集群是无法满足多样的算法需求的, 我们在搜索的各个部件上都有相应的算法插件, 用于构建商业电商搜索引擎的算法体系. ### 1.1 索引

LDA工程实践之算法篇之(一)算法实现正确性验证(转)

研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiwang带领下,与孙振龙.严浩等一起实现了一套大规模并行的LDA训练系统——Peacock.受rick影响,决定把自己对LDA工程实践方面的一些理解整理出来,分享给大家,其中可能有一些疏漏和错误,还请批评指正. Rickjin在<LDA数学八卦>[1]一文中已经对LDA的数学模型以及基本算法介绍得比

[Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的

作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583]http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_AonqzL0rpdQAjjqlHQQ 如果我的帮到了你,是否乐意捐助一下或请一杯啤酒也好呢?有你支持,干的更好~ 点这参与众筹 我的支付宝:13958686678 2.1 前言 自从上篇[Java 泥水

数据结构和算法篇——散列表

之前讲过博主在某网买了一个数据结构与算法的课程.本篇散列表是其中的三节.散列表应该是 Java 程序员常用并且最先碰到的一个数据结构了吧?Java 的 HashMap 就是对散列表的实现.可以说散列表算是一个比较基础.比较好理解(抛开需要缜密设计的哈希函数不说).比较好用(查询时间复杂度O(1))的一种数据结构.本篇在此分享这三节的总结笔记. 1)散列表开篇介绍:https://www.cnblogs.com/christmad/p/11519055.html 2)如何打造一个工业级的散列表:h