精华内容
下载资源
问答
  • 10 亿不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的(10000中最小的),将这个数替换堆顶,并调整结构使...

    一、问题

    有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字?

    这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。

    复杂度分析

    建堆时间复杂度是O(m),堆调整的时间复杂度是O(logm),最终时间复杂度等于,1次建堆时间+n次堆调整时间=O(m+nlogm)=O(nlogm)
    这里的n为10亿,m为10000

    关于建堆时间复杂度为 O(m)的证明:https://www.zhihu.com/question/20729324

    优化的方法

    可以把所有10亿个数据分组存放,比如分别放在1000个文件中。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出最终的结果。

    下面整理一下这方面的类似问题:

    二、top K 问题

    在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。

    针对top K类问题,通常比较好的方案是:分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树活着Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。

    例如,有1亿个浮点数,如何找出其最大的10000个?

    最容易想到的方法是:将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序。但是在32位的机器上,每个float类型占4个字节,1亿个浮点数就要占用400MB的存储空间,对于一些可用内存小于400M的计算机而言,很显然是不能一次将全部数据读入内存进行排序的。其实即使内存能够满足要求(我机器内存都是8GB),该方法也并不高效,因为题目的目的是寻找出最大的10000个数即可,而排序却是将所有的元素都排序了,做了很多的无用功。

    第二种方法为 局部淘汰法,该方法与排序方法类似,用一个容器保存前10000个数,然后将剩余的所有数字——与容器内的最小数字相比,如果所有后续的元素都比容器内的10000个数还小,那么容器内这个10000个数就是最大10000个数。如果某一后续元素比容器内最小数字大,则删掉容器内最小元素,并将该元素插入容器,最后遍历完这1亿个数,得到的结果容器中保存的数即为最终结果了。此时的时间复杂度为O(n+m^2),其中m为容器的大小,即10000。

    第三种方法是 分治法,将1亿个数据分成100份,每份100万个数据,找到每份数据中最大的10000个,最后在剩下的 100 * 10000 个数据里面找出最大的10000个。如果100万数据选择足够理想,那么可以过滤掉1亿数据里面99%的数据。100万个数据里面查找最大的10000个数据的方法如下:
    用快速排序的方法,将数据分为2堆,如果大的那堆个数N大于10000个,继续对大堆快速排序一次分成2堆,如果大的那堆个数N大于10000个,继续对大堆快速排序一次分成2堆,如果大堆个数N小于10000个,就在小的那堆里面快速排序一次,找第10000-n大的数字;递归以上过程,就可以找到第1w大的数。
    参考上面的找出第1w大数字,就可以类似的方法找到前10000大数字了。此种方法需要每次的内存空间为10^6*4=4MB,一共需要101次这样的比较。

    第四种方法是 Hash 法。如果这1亿个书里面有很多重复的数,先通过Hash法,把这1亿个数字去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通过分治法或最小堆法查找最大的10000个数。

    第五种方法 采用最小堆。首先读入前10000个数来创建大小为10000的最小堆,建堆的时间复杂度为O(mlogm)(m为数组的大小即为10000),然后遍历后续的数字,并于堆顶(最小)数字进行比较。如果比最小的数小,则继续读取后续数字;如果比堆顶数字大,则替换堆顶元素并重新调整堆为最小堆。整个过程直至1亿个数全部遍历完为止。然后按照中序遍历的方式输出当前堆中的所有10000个数字。该算法的时间复杂度为O(nmlogm),空间复杂度是10000(常数)。

    三、实际运行

    实际上,最优的解决方案应该是最符合实际设计需求的方案,在时间应用中,可能有足够大的内存,那么直接将数据扔到内存中一次性处理即可,也可能机器有多个核,这样可以采用多线程处理整个数据集。

    下面针对不容的应用场景,分析了适合相应应用场景的解决方案。

    (1)单机+单核+足够大内存

    如果需要查找10亿个查询次(每个占8B)中出现频率最高的10个,考虑到每个查询词占8B,则10亿个查询次所需的内存大约是10^9 * 8B=8GB内存。如果有这么大内存,直接在内存中对查询次进行排序,顺序遍历找出10个出现频率最大的即可。这种方法简单快速,使用。然后,也可以先用HashMap求出每个词出现的频率,然后求出频率最大的10个词。

    (2)单机+多核+足够大内存

    这时可以直接在内存总使用Hash方法将数据划分成n个partition,每个partition交给一个线程处理,线程的处理逻辑同(1)类似,最后一个线程将结果归并。

    该方法存在一个瓶颈会明显影响效率,即数据倾斜。每个线程的处理速度可能不同,快的线程需要等待慢的线程,最终的处理速度取决于慢的线程。而针对此问题,解决的方法是,将数据划分成c×n个partition(c>1),每个线程处理完当前partition后主动取下一个partition继续处理,知道所有数据处理完毕,最后由一个线程进行归并。

    (3)单机+单核+受限内存

    这种情况下,需要将原数据文件切割成一个一个小文件,如次啊用hash(x)%M,将原文件中的数据切割成M小文件,如果小文件仍大于内存大小,继续采用Hash的方法对数据文件进行分割,知道每个小文件小于内存大小,这样每个文件可放到内存中处理。采用(1)的方法依次处理每个小文件。

    (4)多机+受限内存

    这种情况,为了合理利用多台机器的资源,可将数据分发到多台机器上,每台机器采用(3)中的策略解决本地的数据。可采用hash+socket方法进行数据分发。

    从实际应用的角度考虑,(1)(2)(3)(4)方案并不可行,因为在大规模数据处理环境下,作业效率并不是首要考虑的问题,算法的扩展性和容错性才是首要考虑的。算法应该具有良好的扩展性,以便数据量进一步加大(随着业务的发展,数据量加大是必然的)时,在不修改算法框架的前提下,可达到近似的线性比;算法应该具有容错性,即当前某个文件处理失败后,能自动将其交给另外一个线程继续处理,而不是从头开始处理。

    top K问题很适合采用MapReduce框架解决,用户只需编写一个Map函数和两个Reduce 函数,然后提交到Hadoop(采用Mapchain和Reducechain)上即可解决该问题。具体而言,就是首先根据数据值或者把数据hash(MD5)后的值按照范围划分到不同的机器上,最好可以让数据划分后一次读入内存,这样不同的机器负责处理不同的数值范围,实际上就是Map。得到结果后,各个机器只需拿出各自出现次数最多的前N个数据,然后汇总,选出所有的数据中出现次数最多的前N个数据,这实际上就是Reduce过程。对于Map函数,采用Hash算法,将Hash值相同的数据交给同一个Reduce task;对于第一个Reduce函数,采用HashMap统计出每个词出现的频率,对于第二个Reduce 函数,统计所有Reduce task,输出数据中的top K即可。

    直接将数据均分到不同的机器上进行处理是无法得到正确的结果的。因为一个数据可能被均分到不同的机器上,而另一个则可能完全聚集到一个机器上,同时还可能存在具有相同数目的数据。

    四、一些经常被提及的该类问题

    (1)有10000000个记录,这些查询串的重复度比较高,如果除去重复后,不超过3000000个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请统计最热门的10个查询串,要求使用的内存不能超过1GB。

    (2)有10个文件,每个文件1GB,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。按照query的频度排序。

    (3)有一个1GB大小的文件,里面的每一行是一个词,词的大小不超过16个字节,内存限制大小是1MB。返回频数最高的100个词。

    (4)提取某日访问网站次数最多的那个IP。

    (5)10亿个整数找出重复次数最多的100个整数。

    (6)搜索的输入信息是一个字符串,统计300万条输入信息中最热门的前10条,每次输入的一个字符串为不超过255B,内存使用只有1GB。

    (7)有1000万个身份证号以及他们对应的数据,身份证号可能重复,找出出现次数最多的身份证号。

    查找重复次数问题

    在海量数据中,查找出重复出现的元素或者去除重复出现的元素也是常考的问题。针对此类问题,一般可以通过位图法实现。例如,已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

    本题最好的解决方法是通过使用位图法来实现。8位整数可以表示的最大十进制数值为99999999。如果每个数字对应于位图中一个bit位,那么存储8位整数大约需要99MB。因为1B=8bit,所以99Mbit折合成内存为99/8=12.375MB的内存,即可以只用12.375MB的内存表示所有的8位数电话号码的内容。

    展开全文
  • 写一函数,求正整数n右边开始数k数字,并在main函数中输入数值测试这函数。 输入样例:1234 3 输出样例:2 若给的数字k超过该整数的位数,应给出提示信息 思路分析: 写一函数fun,用于输入数字n和...

    题目:

    写一个函数,求正整数n从右边开始数的第k个数字,并在main函数中输入数值测试这个函数。
    输入样例:1234 3
    输出样例:2
    若给的数字k超过该整数的位数,应给出提示信息

    思路分析:

    1. 写一个函数fun,用于输入数字n和需要的第几位k,输出需要的数字num。
    2. 函数中创建循环体i,i++循环至i等于需要的第几位k。
    3. 每次循环取模为需要的数字num,并且除以10

    代码实现:

    #include<stdio.h>
    int fun(int n, int k)
    {
    	int i = 0, num = 0;
    	for(i = 1; i <= k; i++)
    	{
    		if(n == 0)
    		{
    			printf("out the limit!\n");
    		}
    		num = n % 10;   
    		n = n / 10;
    	}
    	return num; 
    }
    int main()
    {
    	int a = 0, b = 0, num = 0;
    	printf("Input an integer:");
    	scanf("%d",&a);
    	printf("Input the sequence:");
    	scanf("%d",&b);
    	num = fun(a, b);
    	printf("the number is:%d",num);
    	return 0; 
    }
    

    运行结果:

    如需要5367从右数第二个数字为6
    在这里插入图片描述

    展开全文
  • 1字节:最大0xFF = 255(存储类型byte和char) 2字节:最大0xFF FF = 65535(存储类型shot int) 4字节:最大0xFF FF FF FF= 4294967295(存储类型int 、long) 8字节:最大0xFF FF FF FF FF FF FF FF= ...

    1个字节:最大0xFF = 255(存储类型byte和char) 2个字节:最大0xFF FF = 65535(存储类型shot int) 4个字节:最大0xFF FF FF FF= 4294967295(存储类型int 、long) 8个字节:最大0xFF FF FF FF FF FF FF FF= 18446744073709551615(存储类型long long)

     

    十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。

    中文名:十六进制

    外文名:Hexadecimal

    定义:计算机中数据的一种表示方法

    组成:0-9,A-F

    十六进制的表示方法:十六进制照样采用位置计数法,位权是16为底的幂。对于n位整数,m位小数的十六进制数用加权系数的形式表示如下:

    举例说明:

    16进制的20表示成10进制就是:2×161+0×16º=32

    10进制的32表示成16进制就是:20

    十进制数可以转换成十六进制数的方法是:十进制数的整数部分“除以16取余”,十进制数的小数部分“乘16取整”,进行转换。

    比如说十进制的0.1转换成八进制为0.0631463146314631。就是0.1乘以8=0.8,不足1不取整,0.8乘以8=6.4,取整数6, 0.4乘以8=3.2,取整数3,依次下算。

    编程中,我们常用的还是10进制.毕竟C/C++是高级语言。比如:

    int a = 100,b = 99;

    不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:

    0000

    0000

    0000

    0000

    0110

    0100

    面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?2、8、16,分别是2的1次方、3次方、4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。

    转换

    二进制转换十进制

    二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……

    所以,设有一个二进制数:101100100,转换为10进制为:356

    用横式计算

    0×20+0×21+1×22+0×23+0×24+1×25+1×26+0×27+1×28=356

    0乘以多少都是0,所以我们也可以直接跳过值为0的位:

    1×22+1×25+1×26+1×28=356

    4+32+64+256 =356

    八进制转换十进制

    八进制就是逢8进1。

    八进制数采用 0~7这八数来表达一个数。

    八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……

    所以,设有一个八进制数:1507,转换为十进制为:839,具体方法如下:

    可以用横式直接计算:

    7×80+0×81+5×82+1×83=839

    也可以用竖式表示

    第0位 7×80=7

    第1位 0×81=0

    第2位 5×82=320

    第3位 1×83=512

    十六进制转换十进制

    16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

    十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

    所以,在第N(N从0开始)位上,如果是数β (β大于等于0,并且β小于等于 15,即:F)表示的大小为 β×16的N次方。

    假设有一个十六进数 2AF5

    直接计算就是:

    5×160+F×161+A×162+2×163=10997[1]

    也可以用竖式表示:

    第0位: 5×160=5

    第1位: F×16^1=240

    第2位: A×162=2560

    第3位: 2×163=8192

    -------------------------------

    10997

    此处可以看出,所有进制换算成10进制,关键在于各自的权值不同。

    假设有人问你,十进数1234 为什么是一千二百三十四?你尽可以给他这么一个算式:

    1234 = 1×103+2×102+3×101+4×100

    十六进制互相转换

    首先我们来看一个二进制数:1111,它是多少呢?

    你可能还要这样计算:1×20+1×21+1×22+1×23=1×1+1×2+1×4+1×8=15。

    然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23=8,然后依次是 22=4,21=2,20=1。

    记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。

    下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

    仅4位的2进制数 快速计算方法 十进制值 十六进制

    1111 = 8 + 4 + 2 + 1 = 15 =F

    1110 = 8 + 4 + 2 + 0 = 14= E

    1101 = 8 + 4 + 0 + 1 = 13= D

    1100 = 8 + 4 + 0 + 0 = 12 =C

    1011 = 8 + 0 + 2 + 1 = 11= B

    1010 = 8 + 0 + 2 + 0 = 10 =A

    1001 = 8 + 0 + 0 + 1 =9 =9

    ……

    0001 = 0 + 0 + 0 + 1 = 1= 1

    0000 = 0 + 0 + 0 + 0 = 0= 0

    二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

    如(上行为二制数,下面为对应的十六进制):

    1111 1101 , 1010 0101 , 1001 1011

    F D , A 5 , 9 B

    反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

    先转换F:

    看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

    接着转换D

    看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。

    所以,FD转换为二进制数,为:1111 1101

    由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。

    比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:

    被除数 计算过程 商 余数

    1234 1234/16 77 2

    77 77/16 4 13 (D)

    4 4/16 0 4

    结果16进制为:4D2

    然后我们可直接写出4D2的二进制形式:

    0100

    1101

    0010

    其中对映关系为:

    0100 -- 4

    1101 -- D

    0010 -- 2

    同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。

    下面举例一个int类型的二进制数:

    01101101

    11100101

    10101111

    00011011

    我们按四位一组转换为16进制:6D E5 AF 1B

    十进制转十六进制

    采余数定理分解,例如将487710转成十六进制:

    487710÷16=30481....14(E)

    30481÷16=1905....1

    1905÷16=119....1

    119÷16=7....7

    7÷16=0....7

    这样就计到487710(10)=7711E(16)

    表达方法

    程序的表达方法环境 格式备注URL%hex无 XML,XHTML&#xhex无HTML,CSS#hex6位,表示颜色UnicodeU+hex6位,表示字符编码MIME=hex无Modula-2#hex无Smalltalk,ALGOL 6816rhex无Common Lisp#xhex或#16rhex无IPv68个hex用:分隔无

    C C++的表达方法

    如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。

    C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也不区分大小写。(注意:0x中的0是数字0,而不是字母O)

    以下是一些用法示例:

    int a = 0x100F;

    int b = 0x70 + a;

    至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能表达无符号的正整数,如果你在代码中写:-078,或者写:-0xF2,C,C++并不把它当成一个负数。

    在转义符中的使用

    转义符也可以接一个16进制数来表示一个字符。如 \'?\' 字符,可以有以下表达方式:

    \'?\' //直接输入字符

    \'\77\' //用八进制,此时可以省略开头的0

    \'\0x3F\' //用十六进制

    同样,这一小节只用于了解。除了空字符用八进制数 \'\0\' 表示以外,我们很少用后两种方法表示一个字符。

    展开全文
  • 题目可以用我们前面介绍的打擂台的方法来做:先输入一个数作为擂主,然后,从第个数开始,每输入一个数都跟擂主比较,如果大于擂主,则记住该,使该成为新擂主,否则擂主不变…… 代码如下: #include...

    例1:键盘输入任意10个整数,找出最大数。

    解析如下:

    这个题目可以用我们前面介绍的打擂台的方法来做:先输入一个数作为擂主,然后,从第二个数开始,每输入一个数都跟擂主比较,如果大于擂主,则记住该数,使该数成为新擂主,否则擂主不变……

    代码如下:

    #include<stdio.h>

    int main()

    {int  n, max, i;

     scanf(“%d”, &n);           //输入第一个数

     max = n;                    //第一个数作擂主

     for(i = 2; i <= 10; i++){

       scanf(“%d”, &n);

    if(n > max)              //若n是更大的数

       max = n;               //n成为擂主*/

     }

    printf(“最大数是:%d\n”, max);

    getch();

    return 0;

    }

    例2:键盘输入任意10个数,找出最大数的序号。比如,若键盘输入4,6,7,3,5,9,8,0,1,2,则程序输出6 (第6个数最大)。

    解析如下

    这个题目与例3.8类似,唯一不同的是要求输出最大数的序号而不是最大数的值。程序依然可以用打擂台的方法,但是在每个数与擂主比较的时候,若新数大于max,则要:

    (1)记住这个数,使这个新数成为擂主(以便后面的数跟这个“新擂主”比较)。

    (2)记住这个新擂主的序号。

    代码如下:

    #include<stdio.h>

    int main()

    {int  n, max, k, i;          //k用来记录最大数的序号

     scanf(“%d”,&n);         

     max = n;                     //第一个数作为擂主

     k = 1;                       //目前第一个数最大,记录其序号

     for(i = 2; i <= 10; i++){  //从第二个数开始打擂

        scanf(“%d”, &n);

    if(n > max){              

        max = n;

        k = i;                  //记录新擂主的序号

    }

     }

    printf(“最大数的序号是:%d\n”, k);

    getch();

     return 0;

    }

    程序的关键点在于:若新数大于擂主,既要记录这个数,又要记录它的序号。

     

     

    展开全文
  • 方法1 import random lst = [] rep_lst = [] #重复数字 ...for i in range(10): temp = random.randint(1,20) #产生随机数,闭区间 if temp in lst and temp not in rep_lst: #寻找重复数字 rep...
  • 例如:153是一水仙花,因为153=1^3+5^3+3^3。 Output: 153 ??? ??? ??? 输入 无 输出 所有的水仙花,从小的开始。 每行一 来源/分类 C语言 思路: 最难的就是找水仙花啦。哈哈,...
  • n个数依次入栈,出栈顺序有多少种?

    万次阅读 多人点赞 2018-08-28 15:56:50
    有一容量足够大的栈,n元素以一定的顺序入栈,出栈顺序有多少种? 比如,AB两元素,入栈顺序为AB,出栈情况有两种: (1)入A,出A,入B,出B,出栈顺序为AB; (2)入A,入B,出B,出A,出栈顺序为BA。 ...
  • c语言实现10个数由小到大排序(快速排序法)

    万次阅读 多人点赞 2018-08-07 22:58:35
    序列“2,3,5,7,9,6,4,1,0,8”两端开始 (1)首先将2作为基准,应用2变量i和j分别指向序列左端和右端; (2)首先j左往右寻找一小于2的,i右往左寻找一大于2的; (3)找到了0和3进行一次交换...
  • N个数中选取k个数–不降原则(DFS) 原理 :不降原则(看代码前先看一下原理吧) 举例子: 比如说在6里面随便选5个数,那么选法都是什么呢? 瞎枚举? 12345 12346 前两还不会弄混 然后很可能就乱了 ...
  • 特点,1,2个数为1,从第个数开始,该是前面两个数之和 #include int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i ; i++) { c = a + b; printf("%d\t",c); ...
  • 这是你一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持...
  • 从第一个人开始1到3报), 凡报到3的人退出圈子,问最后留下的是原来几号的那位。 分析: 将每人编上坐标,并且给每人定下最开始的下标,等只剩下最后一人的时候,用他的坐标去找相应人的...
  • C语言编程对10个数进行排序

    千次阅读 2019-03-04 17:13:53
    问题分析:可以利用选择法,即后9比较过程中,选择一最小的与元素交换,下次类推,即用元素与后8进行比较,并进行交换。 程序源码: #include&lt;stdio.h&gt; #define N 10 void ...
  • 例题:下列给定程序中函数fun的功能是:低位开始取出长整型变量a中奇位上的,依次构成一放在b中。 例如,当a中的为7654321时,则b中的为7531。 注意:不要改动main函数,不能增行或删行,也不能更改...
  • DATA SEGMENT ...INFO DB 1,2,3,4,5,70H,71H,72H,80H,92H MAX DB 00H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,10 MOV BX,1000H DEC BX SIGN...
  • 从第1个人开始1-3报),凡报到3的人退出圈子,问最后留下的是原来几号的那位? int n = 10;//n的取值 int num = n;//记录剩余数个数 int arr[] = new int[n];//标记剩余的位置 0 代表存活,初始全部...
  • 1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数多少? 网上流传的题目,说是XX面试题。十有八九是标题党 假设两不相等。且两人计算能力超强。...
  • A选定一 [1,100]之间的数字背对B写在纸上,然后让B开始猜; 如果B猜的偏小,A会提示B这次猜的偏小; 一旦B某次猜的偏大,A就不再提示,此次之后B猜的偏小A也不会再提示,只回答猜对与否。 请问:B至少要猜( )...
  • 从第一个人开始1到3报),凡报到3的人退出圈子,问最后留下的是原来几号。 例如;如果10个人 留下的是4号 这里我们使用数组来实现它。 数组初始化值1开始,如果有10个人,那么数组中存储的值就是[1-...
  •  先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000。建堆
  • 度度熊有一N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只...使用set将输入数组排序,从头遍历,最小值开始,将当前值之前所有比现在值大的放到最后。 19 7 8 25  — 7 8 25 19 — 7 8 —...
  • C语言 | 选择法对10个数排序

    千次阅读 多人点赞 2021-01-13 20:28:10
    例60:C语言实现用选择法对10个整数排序。 解析:选择排序思路如下,设有10个元素a[1]a[10],将a[1]与a[2]a[10],若a[1]比a[2]~a[10]都小,则不进行交换,即无任何操作。...一部分 键盘输入10个数: for(i=1;i<=1
  • 树与二叉树——二叉树中计算叶子结点个数问题

    千次阅读 多人点赞 2019-04-13 18:57:42
    从第一层开始计算每层的节点个数:1,2,4,8,16,32,64,128,256,512,1024... 将前9层的结点数量全部加起来有511,如果加上十层1024,则超过967,所以该完全二叉树肯定是有十层的,所以叶子结点分布在9层和第10...
  • 斐波那契数列的前几个数分别为0,1,1,2,3,5从第三项开始,每一项都等于前面两项的和 读入一整数n,编程求出次数列的前n项 数列0开始 public static void main(String[] args) { //随机输入一整数n ...
  • 看了挺多博客感觉都挺复杂的,自己写这自认为比较简单,也更灵活,希望可以帮到需要的人,也欢迎有大佬批评指正!! n=int(input("请输入总人数:")) m=int(input("请规定报到数字几的人退出圈子:")) circle=[] ...
  • 不同平均的比较;...和流行的观点不同,数学上说,平均通常不是一样东西。意思是:没有可以恰当地称作“平均”的数学运算。我们通常所说的平均是“算术平均”,具体计算过程如前所述。我们称其为...
  • #include <...int a[5]={2,-3,9,39,1},i,max,t; printf(“数组为:\n”); for(i=0;i<5;i++) printf("%4d",a[i]); printf("\n\n"); max=a[0]; for(i=1;i<5;i++) { if(max<a[i]) { max=a[...
  • /*用123456789组成三三位,每数字只能用一次,使得个数个数的两倍,个数个数的三倍*/ #include int x1,x2,x3,y1,y2,y3,z1,z2,z3; void quwei(int &x1,int &x2,int &x3,int x){ x3=x%10; ...
  • 题目:求 整数 1~100之间的 求出 含有 7 或者7的倍数的一共有多少 分别是什么? 拿道题读题后分析: 一步 既然要求出 1~100之间的有 7 或者7的倍数的一共有多少 ,那么我们首先要做的就是遍历1-100之间的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,423,711
精华内容 569,484
关键字:

从10开始数,第五个数是多少?