从100万个整数里找出100个最大的数

100万个整数里找出100个最大的数(用哪种算法效率高)



以下为可能性最大的答案:
部分排序?找出一个支点,把数组分为左右,一直分...


可以参考一下STL中nth_element的实现吧。


选择第k大数有O(n)的算法,过程衍生自快排


呵呵我看懂啦,是个好算法!顶!


取前100个数排序,放入链表中.依次取后面的数与100个数的最小数比较,若取到的数比最小数大,则插入链表中,同时挤掉最小的数.这个过程中使用的链表,因为大小是固定的,所以只需要一开始分配101个节点,用一个指针记录那个空节点,则在整个插入删除过程序中,可以不涉及到内存分配.


引用 12 楼 wyx8421 的回复:
用堆排序只取前100个可以么?时间复杂度好像是O(m(logn))

27楼的做法确实比飞雪前面提的数组要节省空间



27楼的我分析一下。
在n个数中取出m个最大的:
1、排序m个数,mlogm
2、每插入一个数,比较次数取平均值m/2,共(n-m)*m/2
所以总复杂度:mlogm + (n-m)*m/2 = (n - m + 2logm)*m/2
m << n 时,为O(nm);
m = k*n 时,为O(n^2);

而我方法的最坏情况不会超过完全排序一个数组(肯定不会超过,
因为每次递归都丢弃了数组的一半)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一些经典的习题 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总为多少? 1.程序分析: 兔子的规律为列1,1,2,3,5,8,13,21.... 【程序2】 题目:判断101-200之间有多少个素,并输出所有素。 1.程序分析:判断素的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此不是素,反之是素。 【程序3】 题目:打印出所有的"水仙花",所谓"水仙花"是指一个三位,其各位字立方和等于该本身。例如:153是一个"水仙花",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 【程序4】 题目:将一个正整数分解质因。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因,应先找到一个最小的质k,然后按下述步骤完成: (1)如果这个质恰等于n,则说明分解质因的过程已经结束,打印出即可。 (2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 【程序6】 题目:输入两个正整数m和n,求其最大公约和最小公倍。 1.程序分析:利用辗除法。 【程序7】 题目:输入一行字符,分别统计出其英文字母、空格、字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'. 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 【程序9】 题目:一个数如果恰好等于它的因子之和,这个数就称为"完"。例如6=1+2+3.编程 找出1000以内的所有完。 【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? 【程序11】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复字的三位?都是多少? 1.程序分析:可填在百位、十位、个位的字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 【程序12】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10元时,奖金可提10%; 利润高于10元,低于20元时,低于10元的部分按10%提成,高于10元的部分,可提成7.5%; 20到40之间时,高于20元的部分,可提成5%; 40到60之间时高于40元的部分,可提成3%; 60100之间时,高于60元的部分,可提成1.5%, 高于100元时,超过100元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总? 1.程序分析:请利用轴来分界,定位。注意定义时需把奖金定义成长整型。 【程序13】 题目:一个整数,它加上100后是一个完全平方,再加上168又是一个完全平方,请问该是多少? 1.程序分析:在10以内判断,先将该加上100后再开方,再将该加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析: public class FullSquare { public static void main(String[] args) { int t = 0; for (int i = 1; i <= 100; i++) { t = i + 100; for (int j = 1; j <= 100; j++) { if (t == j * j) { t = t + 168; for (int p = 1; p <= 100; p++) { if (t == p * p) System.out.println(i); } } } } } } 【程序14】 题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。 import java.util.Scanner; //题目:输入某年某月某日,判断这一天是这一年的第几天 public class ThisDayIs { public static void main(String[] args) { System.out.println("请输入年份,如:2008"); Scanner YMD = new Scanner(System.in); int year = YMD.nextInt(); System.out.println("请输入月份1~12,如8"); int month = YMD.nextInt(); System.out.println("请输入天1~31,如8"); int day = YMD.nextInt(); if (LeapYear(year)) { switch (month) { case 1: { System.out.println("这是" + year + "的第" + day + "天"); break; } case 2: { day = day + 31; System.out.println("这是" + year + "的第" + day + "天"); break; } case 3: { day = day + 29 + 31; System.out.println("这是" + year + "的第" + day + "天"); break; } case 4: { day = day + 29 + 31 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 5: { day = day + 29 + 31 * 2 + 30; System.out.println("这是" + year + "的第" + day + "天"); break; } case 6: { day = day + 29 + 31 * 3 + 30; System.out.println("这是" + year + "的第" + day + "天"); break; } case 7: { day = day + 29 + 31 * 3 + 30 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 8: { day = day + 29 + 31 * 4 + 30 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 9: { day = day + 29 + 31 * 5 + 30 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 10: { day = day + 29 + 31 * 5 + 30 * 3; System.out.println("这是" + year + "的第" + day + "天"); break; } case 11: { day = day + 29 + 31 * 6 + 30 * 3; System.out.println("这是" + year + "的第" + day + "天"); break; } case 12: { day = day + 29 + 31 * 6 + 30 * 4; System.out.println("这是" + year + "的第" + day + "天"); break; } } } else switch (month) { case 1: { System.out.println("这是" + year + "的第" + day + "天"); break; } case 2: { day = day + 31; System.out.println("这是" + year + "的第" + day + "天"); break; } case 3: { day = day + 28 + 31; System.out.println("这是" + year + "的第" + day + "天"); break; } case 4: { day = day + 28 + 31 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 5: { day = day + 28 + 31 * 2 + 30; System.out.println("这是" + year + "的第" + day + "天"); break; } case 6: { day = day + 28 + 31 * 3 + 30; System.out.println("这是" + year + "的第" + day + "天"); break; } case 7: { day = day + 28 + 31 * 3 + 30 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 8: { day = day + 28 + 31 * 4 + 30 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 9: { day = day + 28 + 31 * 5 + 30 * 2; System.out.println("这是" + year + "的第" + day + "天"); break; } case 10: { day = day + 28 + 31 * 5 + 30 * 3; System.out.println("这是" + year + "的第" + day + "天"); break; } case 11: { day = day + 28 + 31 * 6 + 30 * 3; System.out.println("这是" + year + "的第" + day + "天"); break; } case 12: { day = day + 28 + 31 * 6 + 30 * 4; System.out.println("这是" + year + "的第" + day + "天"); break; } } } private static boolean LeapYear(int year) { if (year % 4 == 0 || year % 100 == 0){ System.out.print(year+"是闰年"); return true; } else return false; } } import java.util.Scanner; //题目:输入某年某月某日,判断这一天是这一年的第几天 public class ThisDayIs { public static void main(String[] args) { System.out.println("请输入年份,如:2008"); Scanner YMD = new Scanner(System.in); int year = YMD.nextInt(); System.out.println("请输入月份1~12,如8"); int month = YMD.nextInt(); System.out.println("请输入天1~31,如8"); int day = YMD.nextInt(); int[] temp = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (LeapYear(year)) { temp[2] = temp[2] + 1; for (int i = 0; i < month; i++) { day += temp[i]; } System.out.println("这是" + year + "的第" + day + "天"); } else { for (int i = 0; i y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 import java.util.Scanner; //题目:输入三个整数x,y,z,请把这三个数由小到大输出。 public class CompareThreeNumber { public static void main(String[] args) { System.out.println("请输入三个数"); Scanner Three = new Scanner(System.in); int xThree = Three.nextInt(); int yThree = Three.nextInt(); int zThree = Three.nextInt(); int temp; if (xThree >= yThree) { temp = xThree; xThree = yThree; yThree = temp; if (yThree >= zThree) { temp = yThree; yThree = zThree; zThree = temp; if (xThree >= yThree) temp = xThree; xThree = yThree; yThree = temp; } } else if (yThree >= zThree) { temp = yThree; yThree = zThree; zThree = temp; if (xThree >= yThree) { temp = xThree; xThree = yThree; yThree = temp; } } System.out.println(xThree + "<" + yThree + "<" + zThree); } } 【程序16】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 //题目:输出9*9口诀。 public class Formula99 { public static void main(String[] args) { for (int row = 1; row <= 9; row++) { for (int line = 1; line = 1;day--){ sum = (sum + 1) *2; System.out.println("第"+(day)+"天一共有"+sum+"个桃子"); } } } 【程序18】 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 1.程序分析:判断素的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此不是素,反之是素。 【程序19】 题目:打印出如下图案(菱形) * *** ****** ******** ****** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。 【程序20】 题目:有一分序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 1.程序分析:请抓住分子与分母的变化规律。 //题目:有一分序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 public class FractionSum { public FractionSum() { double sum = 0; for (double i = 2; i <= 20; i++) sum += F(i) / F(i - 1); System.out.println("这20项的结果是:" + sum); } public double F(double j) { if (j == 1) return 1; else if (j == 2) return 2; else return F(j - 1) + F(j - 2); } public static void main(String[] args) { new FractionSum(); } } 【程序21】 题目:求1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 //题目:求1+2!+3!+...+20!的和 public class Factorial { public Factorial() { int sum = 0; for (int i = 1; i <= 20; i++) { int temp = 1; for (int j = 1; j <= i; j++) { temp *= j; } sum += temp; } System.out.println("前20个数的阶乘和为" + sum); } public static void main(String[] args) { new Factorial(); } } //题目:求1+2!+3!+...+20!的和 public class Factorial { public Factorial() { int sum = 0; for (int i = 1; i <= 4; i++) { sum += F(i); } System.out.println("前20个数的阶乘和为" + sum); } public int F(int n) { if (n == 1) return 1; else return n * F(n - 1); } public static void main(String[] args) { new Factorial(); } } 【程序22】 题目:利用递归方法求5!。 1.程序分析:递归公式:fn=fn_1*4! public class Recursion { public Recursion(int number) { System.out.println(number+"的阶乘是:"+F(number)); } public int F(int n) { if (n == 1) return 1; else return n * F(n - 1); } public static void main(String[] args){ new Recursion(5); } } 【程序23】 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁,需知道第四人的岁,依次类推,推到第一人(10岁),再往回推。 【程序24】 题目:给一个不多于5位的正整数,要求:一、求它是几位,二、逆序打印出各位字。 【程序25】 题目:一个5位,判断它是不是回文。即12321是回文,个位与位相同,十位与千位相同。 【程序26】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。 【程序27】 题目:求100之内的素 【程序28】 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。 【程序29】 题目:求一个3*3矩阵对角线元素之和 1.程序分析:利用双重for循环控制输入二维组,再将a[ i ][ i ]累加后输出。 【程序30】 题目:有一个已经排好序的组。现输入一个数,要求按原来的规律将它插入。 1. 程序分析:首先判断此是否大于最后一个数,然后再考虑插入间的的情况,插入后此元素之后的,依次后移一个位置。 【程序31】 题目:将一个数组逆序输出。 1.程序分析:用第一个与最后一个交换。 import java.util.Scanner; //题目:将一个数组逆序输出。 public class ArrayReverse { public ArrayReverse() { System.out.println("输入一个数指明组长度"); Scanner number = new Scanner(System.in); int n = number.nextInt(); System.out.println("输入一个数组"); int[] Array = new int[n]; Reverse(Array); } public void Reverse(int[] Array) { Scanner array = new Scanner(System.in); for (int i = 0; i = 0; i++, j--) { int x, y; x = Array[i]; y = Array[j]; Array[j] = x; Array[i] = y; if (i >= j) break; } for (int i = 0; i < Array.length; i++) System.out.print(Array[i] + " "); } public static void main(String[] args) { new ArrayReverse(); } } 【程序32】 题目:取一个整数a从右端开始的4~7位。 程序分析:可以这样考虑: (1)先使a右移4位。 (2)设置一个低4位全为1,其余全为0的。可用~(~0<<4) (3)将上面二者进行&运算。 【程序33】 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 【程序34】 题目:输入3个数a,b,c,按大小顺序输出。 1.程序分析:利用指针方法。 【程序35】 题目:输入组,最大的与第一个元素交换,最小的与最后一个元素交换,输出组。 【程序36】 题目:有n个整数,使其前面各顺序向后移m个位置,最后m个数变成最前面的m个数 【程序37】 题目:有n个人围成一圈,顺序排号。从第一个人开始报(从1到3报),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位。 【程序38】 题目:写一个函,求一个字符串的长度,在main函输入字符串,并输出其长度。 【程序39】 题目:编写一个函,输入n为偶时,调用函求1/2+1/4+...+1/n,当输入n为奇时, 调用函1/1+1/3+...+1/n(利用指针函) 【程序40】 题目:字符串排序。 【程序41】 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 【程序42】 题目:809*??=800*??+9*??+1 其??代表的两位,8*??的结果为两位,9*??的结果为3位。求??代表的两位,及809*??后的结果。 【程序43】 题目:求0—7所能组成的奇个数。 【程序44】 题目:一个偶总能表示为两个素之和。 【程序45】 题目:判断一个素能被几个9整除 【程序46】 题目:两个字符串连接程序 【程序47】 题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。 【程序48】 题目:某个公司采用公用电话传递据,据是四位的整数,在传递过程是加密的,加密规则如下:每位字都加上5,然后用和除以10的余代替该字,再将第一位和第四位交换,第二位和第三位交换。 【程序49】 题目:计算字符串子串出现的次 【程序50】 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的据和计算出的平均分存放在磁盘文件"stud"
几十个Java示例程序,搞懂了考试不成问题 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总为多少? 1.程序分析: 兔子的规律为列1,1,2,3,5,8,13,21.... 【程序2】 题目:判断101-200之间有多少个素,并输出所有素。 1.程序分析:判断素的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此不是素,反之是素。 【程序3】 题目:打印出所有的"水仙花",所谓"水仙花"是指一个三位,其各位字立方和等于该本身。例如: 153是一个"水仙花",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 【程序4】 题目:将一个正整数分解质因。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因,应先找到一个最小的质k,然后按下述步骤完成: (1)如果这个质恰等于n,则说明分解质因的过程已经结束,打印出即可。 (2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示。 1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 【程序6】 题目:输入两个正整数m和n,求其最大公约和最小公倍。 1.程序分析:利用辗除法。 【程序7】 题目:输入一行字符,分别统计出其英文字母、空格、字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'. 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加), 几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 【程序9】 题目:一个数如果恰好等于它的因子之和,这个数就称为"完"。例如6=1+2+3.编程 找出1000以内的所有完 。 【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多 少米?第10次反弹多高? 【程序11】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复字的三位?都是多少? 1.程序分析:可填在百位、十位、个位的字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 【程序12】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10元时,奖金可提10%;利润高于10元,低于20 元时,低于10元的部分按10%提成,高于10元的部分,可可提成7.5%;20到40之间时,高于20元的部 分,可提成5%;40到60之间时高于40元的部分,可提成3%;60100之间时,高于60元的部分,可 提成1.5%,高于100元时,超过100元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总? 1.程序分析:请利用轴来分界,定位。注意定义时需把奖金定义成长整型。 【程序13】 题目:一个整数,它加上100后是一个完全平方,再加上168又是一个完全平方,请问该是多少? 1.程序分析:在10以内判断,先将该加上100后再开方,再将该加上268后再开方,如果开方后的结果满足 如下条件,即是结果。请看具体分析: 【程序14】 题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且 输入月份大于3时需考虑多加一天。 【程序15】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 1.程序分析:我们想办法把最小的放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x 与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 【程序16】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
第1章 C语言概述 1 1.5 参照本章例题,编写一个C程序,输出以下信息: 1 1.6 写一个程序,输入a,b,c三个值,输出其最大者。 1 第2章 程序的灵魂——算法 2 2.1 什么叫结构化的算法?为什么要提倡结构化的算法? 2 2.7 什么叫结构化程序设计?它的主要内容是什么? 2 第3章 据类型、运算符与表达式 2 3.3请将下面各用八进制和十六进制表示: 2 3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后据在内存的存储形式。 2 3.5字符常量和字符串常量有什么区别? 3 3.6写出以下程序运行的结果: 3 3.7要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。 4 3.8例2.6能否改成如下: 4 3.9求下面算术表达式的值。 4 3.10写出程序运行的结果。 5 3.11写出下面赋值的结果。格写了值的是要将它赋给其他类型的变量,将所有空格填上赋值后的值。 5 3.12 出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。 5 第4章 最简单的C程序设计——顺序程序设计 6 4.4 若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 6 4.5请写出下面程序的输出结果: 7 4.6 用下面的scanf函输入据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入? 7 4.7下面的scanf函输入据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入据? 8 4.8圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用scanf输入据,输出计算结果,输出时要求有文字说明,取小点后2位字。请编程序。 8 4.9输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F-32) 9 输出要有文字说明,取2位小。 9 第5章 选择结构程序设计 10 5.2语言如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? 10 5.3写出下面各逻辑表达式的值。设a=3,b=4,c=5。 10 5.4有3个整数a,b,c,由键盘输入,输出其最大。 10 5.5有一函: 11 5.6给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。 12 5.7给定一个不多于5位的正整数,要求:①求它是几位;②分别打印出每一位字;③按逆序打印出各位字。例如原为321,应输出123。 13 5.8企业发放的奖金根据利润提成。利润I低于或等于10元时,奖金可提10%;利润高于10元,低于20元(100000<I≤200000)时,其10元按10%提成,高于10元的部分,可提成7.5%;200000 <I≤400000时,其20元仍按上述办法提成(下同),高于20元的部分按5%提成;400000<I≤600000时,高于40元的部分按3%提成;6000001000000时,超过100的部分按1%提成。从键盘输入当月利润I,求应发放奖金总。 14 5.9输入4个整数,要求按由小到大的顺序输出。 16 5.10有4个圆塔,圆心分别为(2,2),(-2,2),(2,-2),(-2,-2),圆半径为1。见图4.4。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。 16 第6章 循环控制 17 6.1输入两个正整数m和n,求其最大公约和最小公倍。 17 6.2输入一行字符,分别统计出其英文字母,空格,字和其它字符的个数。 18 6.3 18 6.4求∑n!(即求1+2!+…+20!)。 19 6.5求 19 6.6打印出所有的“水仙花”。 20 6.7一个数如果恰好等于它的因子之和,这个数就称为“完“。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完”。编程序找出1000以内的所有“完”,并按下面的格式输出其因子:6 Its factors are 1,2,3 20 6.8有一分序列: 23 6.9一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹多高? 23 6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩一个桃子了。求第一天共摘多少桃子。 24 6.11用迭代法求 24 6.12用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。 25 6.13用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。 26 6.14打印出以下图案: 27 6.15两个乒乓球队进行比赛,各出3人。甲队为A、B、C3人,乙队为X、Y、Z3人。已抽签决定比赛名单。有人向队员打听比赛名单。A说他不和X比,C说他不和X、Z比。请编程找出3对赛手的名单。 28 第7章 组 28 7.1用筛法求100之内的素。 28 7.2用选择法对10个整数排序(从小到大)。 30 7.3求一个3×3矩阵对角线元素之和。 31 7.4有一个已排好序的组,今输入一个数,要求按原来排序的规律将它插入。 32 7.5将一个数的值按逆序重新存放。例如原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 34 7.6打印出以下的杨辉三角形(要求打印出10行)。 35 7.7输出魔方阵。所谓魔方阵是指这样的方阵(方阵的阶应为奇),它的每一行、每一列和对角线之和均相等。 36 7.8找出一个二维的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。 38 7.9有15个数按从小到大的顺序存放在一个数。输入一个数,要求用折半查找法找出第几个元素的值。如果该不在,输出“不在表”。 39 7.10有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其英文大写字母,小写字母,字,空格以及其它字符的个数。 41 7.11打印以下图案: 42 7.12有一行电文,已按下面规律译成密码: 43 7.13编一个程序,将两个字符串连接起来,不要用strcat函。 45 7.14编一个程序,将两个字符串s1和s2进行比较。如果s1>s2,输出一个正;s1=s2,输出0;s1<s2,输出一个负。不要用strcmp函。两个字符串用gets函读入。输出的正或负的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,’A’与’C’相比,由于’A’<’C’,应输出负,由于’A’与’C’的ASCII码的差值为2,因此,应输出”-2”。同理:’’And’’和”Aid”比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出’5’。 45 7.15编写一个程序,将字符组s2的全部字符拷贝到字符组s1,不用strcpy函。拷贝时,’\0’也要拷过去,’\0’后面的字符不拷贝。 46 第8章 函 47 8.1写两个函,分别求两个整数最大公约和最小公倍,用主函调用这两个函,并输出结果,两个整数由键盘输入。 47 8.2 47 8.3写一个判素的函,在主函输入一个整数,输出是否素的信息。 49 8.4写一函,使给定的一个二维组(3×3)转置,即行列互换。 49 8.5写一函,使输入的一个字符串按反序存放,在主函输入和输出字符串。 50 8.6写一函,将两个字符串连接。 51 8.7写一函,输入一个4位字,要求输出这4个数字字符,但每两个数字之间有一个空格。如输入1990,应输出”1 9 9 0”。 52 8.8编写一函,有实参传来一个字符串,统计此字符串字母,字,空格和其它字符的个数,在主函输入字符串以及输出上述的结果。 52 8.10写一函,用“起泡法”对输入的10个字符按由小到大的顺序排列。 54 8.11用弦截法求根。 55 8.12输入10个学生5门课的成绩,分别用函求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分所对应的学生和课程;(4)求出平均分方差; 57 8.13写几个函:(1)输入10个职工的姓名和职工号;(2)按职工号由小到大排序,姓名顺序也随之调整;(3)要求输入一个职工号,用折半查找法找出该职工的姓名。 61 8.14写一函,输入一个十六进制,输出相应的十进制。 64 8.15给出年,月,日,计算该日是该年的第几天。 65 第9章 预处理命令 66 9.1定义一个代参的宏,使两个参的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 66 9.2输入两个整数,求它们相除的余。用带参的宏来实现,编程序。 67 9.3 67 9.4给年份year定义一个宏,以判断该年份是否为闰年。 68 9.5请分析以下一组宏所定义的输出格式: 68 9.6请设计输出实的格式。实用“6.2f”格式输出。 69 9.7分别用函和带参的宏,从3个数找出最大。 70 9.8试述“文件包含”和程序文件的连接(link)的概念,二者有何不同? 71 9.9用条件编译法实现以下功能: 71 第10章 指针 72 10.1输入3个整数,按由小到大的顺序输出。 72 10.2输入3个字符串,按由小到打的顺序输出。 73 10.3输入10个整数,将其最小的与第一个数对换,把最大的一个数与最后一个对换。写3个函:(1)输入10个数;(2)进行处理;(3)输出10个数。 74 10.4有n个整数,使其前面各顺序向后移m个位置,最后m个数变成前面m个数。 75 写一函实现以上功能,在主函输入n个整数,并输出调整后的n个数。 75 10.5有一字符串,包含n个字符。写一个函,将此字符串从第m个字符开始的全部字符复制成为另一个字符串。 76 10.6输入一行文字,找出大写字母,小写字母,空格,字及其他字符各有多少。 77 10.7写一个函,将一个3×3的矩阵转置。 77 9.8将一个5×5的矩阵最大的元素放在心,4个角分别放在4个最小的元素(按从左到右,从上到下的顺序,依次从小到大存放),写一个函实现之,并用main函调用。 78 10.9在主函输入10个等长的字符串。用另一个函对它们排序,然后在主函输出这10个已排好序的字符串。 80 10.10用指针组处理上一题目,字符串不等长。 81 10.11将n个数按输入输出顺序的逆序排列,用函实现。 82 10.12有一个班4个学生,5门课。(1)求第一门课的平均分;(2)找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;(3)找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函实现上3个要求。 83 10.13输入一个字符串,内有字和非字字符,如: 86 10.14写一函,实现两个字符串的比较。即自己写一个strcmp函,函原型为: 88 10.15编写一个程序,打入月份号,输出该月的英文月名。例如,输入”3”,则输出”March”,要求用指针组处理。 89 10.16用指向指针的指针的方法对5个字符串排序并输出。 89 10.17用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函。n和正整数在主函输入。最后在主函输出。 90 第11章 结构体与共用体 91 11.1定义一个结构体变量(包括年,月,日)。计算该日在本年是第几天,注意闰年问题。 91 11.2写一个函days,实现上面的计算。由主函将年,月,日传递给days函,计算后将日传回主函输出。 93 11.3编写一个函print,打印一个学生的成绩组,该有5个学生的据记录,每个记录包括num,name,score[3],用主函输入这些记录,用print函输出这些记录。 95 11.4在上题的基础上,编写一个函input,用来输入5个学生的据记录。 97 11.5有10个学生,每个学生的据包括学号,姓名,3门课的成绩,从键盘输入10个学生的据,要求打印出3门课的总平均成绩,以及最高分的学生的据(包括学号,姓名,3门课成绩,平均分)。 97 11.6编写一个函new,对n个字符开辟连续的存储空间,此函应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。 100 11.7写一函free,将上题new函占用的空间释放free(p)表示将p(地址)指向的单元以后的内存段释放。 101 11.8已有a,b两个链表,每个链表的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。 101 11.9有两个链表a和b,设结点包含学号,姓名。从a链表删去与b链表有相同学号的那些结点。 104 11.10建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表的结点所包含的年龄等于此年龄,则将此结点删去。 106 第12章 位运算 109 12.1编写一个函getbits,从一个16位的单元取出某几位()即该几位保留原值,其余位为0)。函调用形式为: 109 12.2写一个函,对一个16位的二进制取出它的奇位(即从左边起第1,3,5,…,15位)。 109 12.3编一程序,检查一下你所用的计算机系统的C编译在执行右移时是按照逻辑位移的原则,还是按照算术右移的原则。如果是逻辑右移,请编一函实现算术右移;如果是算术右移,请编一函实现逻辑右移。 110 12.4编一函用来实现左右循环移位。函名为move,调用方法为:move(value,n) 112 其value为要循环位移的,n为位移的位。如n0为右移。如n=4,表示要右移4位;n=-3,表示要左移3位。 112 第13章 文件 113 13.3从键盘输入一个字符串,将其的小写字母全部转换成大写字母,然后输出到一个磁盘文件”test”保存。输入的字符串以”!”结束。 113 13.4有两个磁盘文件“A”和“B”,各存放一行字母,要求把这两个文件的信息合并(按字母的顺序排列),输出到一个新文件“C”。 114 13.5有5个学生,每个学生有3门课的成绩,从键盘输入以上据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有据和计算出的平均分存放在磁盘文件stud。 115 13.7将上题已排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件。 122 13.8将上题的结果仍存入原有的stu_sort文件而不另建立新文件。 123 13.9有一磁盘文件emploee,内存放职工的据。每个职工的据包括:职工姓名,职工号,性别,年龄,住址,工资,健康状况,文化程度。要求将职工名和工资的信息单独抽出来另建一个简明的职工工资文件。 125 13.10从上题的“职工工资文件”删去一个职工的据,再存回原文件。 127
据的⼀些⾯试题 ⼤据的⼀些⾯试题 五、双层桶划分—-其实本质上就是【分⽽治之】的思想,重在"分"的技巧上! 适⽤范围:第k⼤,,不重复或重复的字 基本原理及要点:因为元素范围很⼤,不能利⽤直接寻址表,所以通过多次划分,逐步确定范围,然后最后在⼀个可以接受的范围内进⾏。 可以通过多次缩⼩,双层只是⼀个例⼦。 扩展: 问题实例: 1).2.5亿个整数找出不重复的整数个数,内存空间不⾜以容纳这2.5亿个整数。 有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(⽐如⽤单个⽂件代表⼀个区域),然后将据分离到 不同的区域,然后不同的区域在利⽤bitmap就可以直接解决了。也就是说只要有⾜够的磁盘空间,就可以很⽅便的解决。 2).5亿个int找它们的。 这个例⼦⽐上⾯那个更明显。⾸先我们 将int划分为2^16个区域,然后读取据统计落到各个区域⾥的个数,之后我们根据统计结果就 可以判断落到那个区域,同时知道这个区域的第 ⼏⼤刚好是。然后第⼆次扫描我们只统计落在这个区域的那些就可以 了。 实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受 的程度。即可以先将int64分成2^24个区域,然后确定区域 的第⼏⼤,在将该区域分成2^20个⼦区域,然后确定是⼦区域的第⼏⼤,然后⼦区域⾥ 的个数只有2^20,就可以直接利⽤direct addr table进⾏统计了。 六、据库索引 适⽤范围:⼤据量的增删改查 基本原理及要点:利⽤据的设计实现⽅法,对海量据的增删改查进⾏处理。 七、倒排索引(Inverted index) 适⽤范围:搜索引擎,关键字查询 基本原理及要点:为何叫倒排索引?⼀种索引⽅法,被⽤来存储在全⽂搜索下某个单词在⼀个⽂档或者⼀组⽂档的存储位置的映射。 以英⽂为例,下⾯是要被索引的⽂本: T0 = "it is what it is" T1 = "what is it" T2 = "it is a banana" 我们就能得到下⾯的反向⽂件索引: "a": {2} "banana": {2} "is": {0, 1, 2} "it": {0, 1, 2} "what": {0, 1} 检索的条件"what","is"和"it"将对应集合的交集。 正向索引开发出来⽤来存储每个⽂档的单词的列表。正向索引的查询往往满⾜每个⽂档有序 频繁的全⽂查询和每个单词在校验⽂档的验证 这样的查询。在正向索引,⽂档占据了⼼的位置,每个⽂档指向了⼀个它所包含的索引项的序列。也就是说⽂档 指向了它包含的那些单 词,⽽反向索引则是单词指向了包含它的⽂档,很容易看到这个反向的关系。 扩展: 问题实例:⽂档检索系统,查询那些⽂件包含了某单词,⽐如常见的学术论⽂的关键字搜索。 ⼋、外排序 适⽤范围:⼤据的排序,去重 基本原理及要点:外排序的归并⽅法,置换选择败者树原理,最优归并树 扩展: 问题实例: 1).有⼀个1G⼤⼩的⼀个⽂件,⾥⾯每⼀⾏是⼀个词,词的⼤⼩不超过16个字节,内存限制⼤⼩是1M。返回频最⾼的100个词。 这个数据具有很明显的特点,词的⼤⼩为16个字节,但是内存只有1m做hash有些不够,所以可以⽤来排序。内存可以当输⼊缓冲区使⽤。 九、trie树 适⽤范围:据量⼤,重复多,但是据种类⼩可以放⼊内存 基本原理及要点:实现⽅式,节点孩⼦的表⽰⽅式 扩展:压缩实现。 问题实例: 1).有10个⽂件,每个⽂件1G,每个⽂件的每⼀⾏都存放的是⽤户的query,每个⽂件的query都可能重复。要你按照query的频度排序。 2).1000字符串,其有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现? 3).寻找热门查询:查询串的重复度⽐较⾼,虽然总是1千,但如果除去重复后,不超过3百万个,每个不超过255字节。 ⼗、分布式处理 mapreduce 适⽤范围:据量⼤,但是据种类⼩可以放⼊内存 基本原理及要点:将据交给不同的机器去处理,据划分,结果归约。 扩展: 问题实例: 1).The canonical example application of MapReduce is a process to count the appearances of each different word in a set of documents: 2).海量据分布在100台电脑,想个办法⾼效统计出这批据的TOP10。 3).⼀共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数(median)? 经典问题分析 上千or亿

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值