上一页 1 ··· 3 4 5 6 7 8 9 10 下一页
摘要: 问题描述:在做筛法求质数的问题时,在删除非质数的数据时,有很多是重复删除的。例如,如果有一个数是3x7x17x23,那么在删除3的倍数时会删除它,删除7,17与23的倍数时也都会删除它。请写一个程序,在删除非质数时"绝对"不做重复的工作。 思路:有一个因式分解定理:任何一个合数都可以分解成若干个质数相乘的形式。那么,num一定可以分解成p的i次方乘以q的形式(p,q是质数且p<q)。所以,需要去除的数就变成了p的2次方,p的3次方,p的4次方......以及p的i次方乘以q,i=1,2,3.......p和q的取值是从小到大的没有被去除的数,所以很容易就可以写出如下的 阅读全文
posted @ 2013-01-02 21:02 NeilHappy 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 问题描述:使用筛法求质数。有一个很神奇的筛子,可以给它一个数i,这个筛子有办法把i的所有倍数去掉。请用这个方法求出2到N之间的所有质数。要求,程序不能使用乘法和除法,只能用加或减,以求加快速度。 该问题的思路来自《C语言名题精选百则技巧篇》,很惭愧,我对这样的涉及一些数学知识的题很少有解决的办法,我需要在这一方面加强。 我把书中的思路归纳如下,并加上了我自己的一些想法。 1. 2的倍数都不是质数,所以不比考虑2的倍数。2是质数,所以考虑的数的集合是 2i+3,i=0,1,2,3,4....... 2. 求质数,只需要处理到num/2就可以了。在程序中MAX为... 阅读全文
posted @ 2012-12-30 22:06 NeilHappy 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 昨天太忙,没有时间做一个题,先记着,明天来补。 问题描述很简单,就是求N之内的所有质数并且打印出来。 思路:求质数有很多方法,我这里用一种比较高效的方法。我一步一步地说明方法。 1.比如判断一个数num是否为质数,那么就用num去对"i(i从2开始)直到根号num"取模,如果都不能整除就说明num是质数。 2.但是这样会有很多次多余的计算。从1到N,有很多数是可以直接被2,3整除了,那么,就需要去除掉能被2,3整除的数。在6个数里,6n+1,6n+2,6n+3,6n+4,6n+5,6n+6中,只有6n+1,6n+5需要被测试。 3.进一步地,将取模的范围缩小为"从 阅读全文
posted @ 2012-12-29 21:38 NeilHappy 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 问题描述:假设有一个数组x[],它有n个元素,每一个都大于零;称x[0]+x[1]+.....+x[i]为前置和,而x[j]+x[j+1]+....+x[n-1]为后置和。编写程序,求出x[]中有多少组相同的前置和与后置和。 我的思路:因为这个数组都是正数,那么,对于i越大,前置和也就越大;后置和是j越小,那么后置和越大。接下来就很简单了,当以x[i]为终点的前置和大于以x[j]为起点的后置和时,j需要减去1,同理可得小于的情况。代码如下: 1 #include <stdio.h> 2 3 int x[]={3,6,2,1,4,5,2}; 4 5 int main() 6 {... 阅读全文
posted @ 2012-12-27 16:44 NeilHappy 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 刚才那题太简单,不过瘾,再做一道题。 问题描述:已知两个元素从小到大排列的数组x[]与y[],请编写一个程序算出两个数组元素彼此之间差的绝对值中最小的一个数,此值称作数组的距离。 我的思路:关键点依然是"两个数组都从小到大排序"。那么,当x[i]==y[j]时,数组间距离为0,这肯定是最小的;当x[i]-y[j]>0时,如果i再增大,那么x[i]也会增大,那么x[i]-y[j]也会增大,而这样的增大不是我们的目标,所以此时要将j加1;同理,如果x[i]-y[j]<0,如果j再增大,那么x[i]-y[j]的绝对值也会增大。代码如下: 1 #include < 阅读全文
posted @ 2012-12-26 20:17 NeilHappy 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 问题描述:已知两个整数数组f[]与g[],它们的元素都已经从小到大排列好,而且两个数组中的元素都各不相同。例如,f[]中有1,3,4,7,9,而g[]中有3,5,7,8,10。试编写程序算出这两个数组之间有多少组相同的元素。就这个例子而言,f[1]与g[0]是一组,f[3]与g[2]是一组。 我的思路:关键点还是"元素都已经从小到大排列好"。那么,两个数组,一起遍历就可以解决问题。代码如下: 1 #include <stdio.h> 2 3 int f[]={1,3,4,7,9}; 4 int g[]={3,5,7,8,10}; 5 int len_f=size 阅读全文
posted @ 2012-12-26 19:34 NeilHappy 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 刚才做的那道题比较简单,再做一道。 问题描述:已知f[]与g[]两个整数数组,元素都已经从小到大排列,请写一个程序,算出f[]比g[]中元素大的对数。换句话说,f[0]比g[]中多少个元素大,f[1]比g[]中多少个元素大,等等,这些值的总和就是要求的答案。举个例子,如果f[]中有1,3,5,7,9,而g[]中有2,3,4,7,8,那么答案就是12。 思路:这个题需要注意的地方就是,两个数组都是从小到大排序的,所以,如果f[1]都大于g[]中所有整数时,那么f[2],f[3]等等都会大于g[]中所有整数。下面是代码: 1 #include <stdio.h> 2 #d... 阅读全文
posted @ 2012-12-25 15:29 NeilHappy 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 问题描述:已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6都是平台。编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的例子中3.3.3就是该数组中最长的平台。 代码如下: 1 #include <stdio.h> 2 #define MAX 1000 3 4 void max_platform_recur(int level); 5 int target[]={1,2,2,3,3,3,4,5,5,6}; 6 int ... 阅读全文
posted @ 2012-12-25 14:37 NeilHappy 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 问题描述:已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6都是平台。编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的例子中3.3.3就是该数组中最长的平台。 我的思路:用distance变量表示平台的长度,从数组target中的第i个数开始,比较target[i]与target[i+distance],如果相等,就distance++;如果不等,就将i+=distance.这样循环下去,知道i+distance==数组长... 阅读全文
posted @ 2012-12-24 19:53 NeilHappy 阅读(469) 评论(0) 推荐(0) 编辑
摘要: 今天是2012年12月22日。今天的算法练习题是最长公共子序列的长度求解。 此题初看时,感觉问题非常复杂,要求解两个序列的最长的(可以不连续)的公共子序列。但是,"将复杂的问题分解成简单的问题"是基本的程序设计思想。分治法是将一个大问题分解成多个相似的小问题,而本题采用的动态规划算法,则是将复杂的问题分解成一系列的相似的子问题。另外,将所求解的子问题的解通过数组等容器保存起来,来节省重复求解相同子问题的时间,是动态规划算法的一个很重要的思想:备忘录思想。 另外,本题还将采用逆向的思路,这与常规的顺序的思路相悖。str1[a],str2[b]两个字符串,不是从左至右的考虑,而 阅读全文
posted @ 2012-12-22 22:40 NeilHappy 阅读(537) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 下一页