摘要: 常规的判断1-n以内的素数的时间复杂度为O(n*sqrt(n)),在n很大的时候时间很长,所以需要别的方法来判断素数。这里介绍筛选法。 1、申请一个数组bool prime[n+1],初始化所有的奇数下标为true,偶数下标为false(2例外)。 2、 for(int i=3;i<=sqrt(n);i+=2){ if(prime[i]) { for(int j=... 阅读全文
posted @ 2012-08-21 09:38 Cavia 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 斐波那契数列的通俗解法是利用递推公式进行递归求解,我们可以更优化的去解决它。 方法一:通项公式 斐波那契数列的递推公式是f(n)=f(n-1)+f(n-2),特征方程为:x2=x+1,解该方程得(1+sqrt(5))/2,(1-sqrt(5))/2.所以f(n)=Ax1n+Bx2n,带入f(0)=0,f(1)=1得A=sqrt(5)/5,B=-sqrt(5)/5.则f(n)求出。 方法... 阅读全文
posted @ 2012-08-15 15:15 Cavia 阅读(1635) 评论(0) 推荐(0) 编辑
摘要: 不需要辅助数组即可归并。 关键在于merge这个函数。两段递增的子数组arr[begin…mid-1]和arr[mid…end],i=begin,j=mid,k=end i往后移动,找到第一个arr[i]>arr[j]的索引 j往后移动,再找第一个arr[j]>arr[i]的索引 然后我们将i到mid的部分和mid到j-1的部分对调,较小的部分就调到前面去了,然后从后面的... 阅读全文
posted @ 2012-07-25 15:22 Cavia 阅读(4043) 评论(3) 推荐(0) 编辑
摘要: Q:有这样一种编码:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位数一样,N,M可以均可以以0开头,N,M的各位数之和要相等,即1+3+4=1+4+3,且M是大于N中最小的一个,现在求这样的序列S,N为一个定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1)) A:要求一个数n的f(n),并且要符合位数相等,各位之和也要相等... 阅读全文
posted @ 2012-07-21 09:28 Cavia 阅读(453) 评论(1) 推荐(1) 编辑
摘要: Q:五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 1)... 阅读全文
posted @ 2012-07-20 09:36 Cavia 阅读(2898) 评论(0) 推荐(0) 编辑
摘要: Q: 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]。 要求: 1.不准用除法运算 A: 要求一:线性时间复杂度,空间复杂度不限。 很简单,两个辅助数组。 void Func(int *a,int *b,int n){ int *left=new int[n]; int *r... 阅读全文
posted @ 2012-07-17 16:37 Cavia 阅读(317) 评论(0) 推荐(0) 编辑
摘要: Q:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10 A:要构造rand10(),则需要保证1-10的每一个数出现的概率为1/10。rand7()能够出现1-7的等概率数字,两次rand7()能出现49种等概率的数字,而如果我们有0-48这49种数字num的话,则当num<40的前提下,num/4+1就能构造出1-10这十个数字... 阅读全文
posted @ 2012-07-17 10:45 Cavia 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 之前在http://www.cnblogs.com/daniagger/archive/2012/06/14/2549777.html中描述了全排列算法的递归解法,这里再说一种算法--字典序排列。 字典序排列就是按照字典a-z,1-9的顺序给出字符串的顺序全排列,例如abc的全排列就是从abc一直排到cba。那么给定一个字符串,怎么找出恰好大于该字符串的下一个排列呢? 我们考虑如下的步骤: ... 阅读全文
posted @ 2012-07-17 09:31 Cavia 阅读(1840) 评论(0) 推荐(0) 编辑
摘要: Q:如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。 例如,对于整数8,可以作为如下三种分解: (1) 8 = 2 + 2 + 2 + 2 (2) 8 = 2 + 3 + 3 (3) 8 = 3 + 5 A:... 阅读全文
posted @ 2012-07-16 16:21 Cavia 阅读(944) 评论(1) 推荐(0) 编辑
摘要: Q:求一个数组的最长递增子序列 A:数组为arr[n] 一个O(n^2)的算法 利用动态规划,利用一个辅助数组b[n],b[i]为对应以arr[i]结尾的最大递增子序列的长度,初始b[0]=1。从arr[1]到arr[n-1]的每次遍历中,设element=arr[i],考虑从当前索引i往前的所有索引j,如果element>arr[j],则当前element有可能扩展成一个新的递增子序... 阅读全文
posted @ 2012-07-16 14:49 Cavia 阅读(327) 评论(0) 推荐(0) 编辑