随笔分类 - 算法与数据结构
摘要:问题描述:n个元素的集合{1,2,, n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:{{1},{2},{3},{4}},{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}},{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2,3,4},{1}},{{1,2,3,4}}给
阅读全文
摘要:快速排序1.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1)分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。 (2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解:在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pi.
阅读全文
摘要:对给出的n个数,求出其所有的排列。思路:对于R={r1,r2,r3.......rn},其全排列可以这样去计算,perm(R)=riperm(R-ri);(1<=i<=n)即以ri为前缀不变,对剩下所有的元素进行排列。即分别以r1,r2,r3,....rn作为前缀不变,对剩下的所有元素进行全排列即为所得到的结果。同理对于perm(R-ri)的求解也是一个相同的过程,因此可以采用递归的思想去解决。#include<iostream>using namespace std;void swap(int &a,int &b){ int temp=a; a=b;
阅读全文
摘要:在前面已经提到了整数划分的问题,在那个问题中,只需要求出整数划分的个数,如果要求将整数划分的所有划分方法也输出,该如何求解?如对于整数6,输出的结果就应该是: 6 5+1 4+2 4+1+1 3+3 3+2+1 3+1+1 2+2+2 2+2+1+1 2+1+1+1+11+1+1+1+1+1 我们可以采用集合的思维去考虑,比如对于整数6,则初始集合相当于{1,1,1,1,1,1} 从1+1+1+1+1+1到2+1+1+1+1实际上就相当于我从左边那一堆{1,1,1,1,1,1}的集合中拿 两个1出来相加然后再把结果放回集合当中得到{2,1,1,1,1}.若这个时候我继续拿集合里面的两个 1..
阅读全文
摘要:素数的求法1.素数的定义 只能被1和它自己整除的自然数称为素数,特别规定1不属于素数。2.求法 (1)根据素数的定义,很明显,如果一个数是素数它的因子只包含1和它本身。 因此可以根据判别某个数的因子的方法来判断其是否是素数。int isprime(int n){ int i; for(...
阅读全文
摘要:拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Orde
阅读全文
摘要:(1)n!末尾有多少个0 第一种思路: n!=n*(n-1)*(n-2)*....3*2*1,而如果要出现0,必须得有2和5出现,但是明显n!中5的因子个数少于2的因子个数,即转化为求 n!中因子5的个数 int count(int n) { int sum=0; while(n) { sum+=n/5; n/=5; } return sum; } 第二种思路:计算n!,每次末尾出现0,则将0消去,计数器并自增1 int count=0; int ans=1; for(i=n;i>=2;i--){ans*=i;while(ans%10==0)//消除末尾的0{ans/=10; count
阅读全文
摘要:阶乘N的阶乘定义为:N!=N×(N-1)×……×2×1请编写一个程序,输出N的阶乘的十进制表示中从最末一个非0位开始自低位向高位数的第M位。其中:0<=N<=10000,1<=K<=5例如:N=5,M=2,结果是1(5!=120) N=8,M=3,结果为0(8!=40320)输入:第一行一个整数M (1<=M<=100),代表测试数据的个数;接下来M行,每行两个整数N,K输出: 输出M行,每行一个整数,即测试数据的结果。 样例:输入:25 28 3输出:10题意:很明了,就是求n!十进制表示中的从最末一个非0位开始自低
阅读全文
摘要:C(n,k) Description求组合数 C ( n , k) 的奇偶性Input文件是多case的,每行输入一个 n (1<=n<=10^9)和 k(0<=k<=n) ,当 n 等于 0 且 k 等于 0 时输入结束Output对于每一个case,输出一行,为组合数 C ( n , k) 的奇偶性,奇输出1,偶输出0Sample Input2 02 10 0Sample Output10 题意:求C(n,k)的奇偶性。显然把C(n,k)的值直接求出来进行判断是不可行的。由于C(n,k)=n!/k!*(n-k)!,要判断奇偶性,即比较分子与分母含有因子2的个数,因此
阅读全文
摘要:分解 n!Description给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为n=p1^m1*p2^m2*p3^m3……* 这里 p1 < p2 < p3 < …… 为质数* 如果 mi = 1, 则 ^ mi 就不需要输出 Input输入是多case的,每行一个数n,1 < n <= 1000000,当n等于0时输入结束Output每个n输出一行,为它的质因数分解形式Sample Input670Sample Output6=2^4*3^2*57=2^4*3^2*5*7 题意:给出n,
阅读全文
摘要:Time Limit: 3000 MS Memory Limit: 65536 K mathpracDescriptionOne lovely afternoon, Bessie's friend Heidi was helping Bessiereview for her upcoming math exam.Heidi presents two integers A (0 <= A <= 45) and B (1 <= B <= 9)to Bessie who must respond with an integer E in the range 1..62
阅读全文
摘要:求n的阶乘某个因子a的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通。其实n!可以表示成统一的方式。n!=(k^m)*(m!)*a 其中k是该因子,m=n/k,a是不含因子k的数的乘积下面推导这个公式n!=n*(n-1)*(n-2)*......3*2*1 =(k*2k*3k.....*mk)*a a是不含因子k的数的乘积,显然m=n/k; =(k^m)*(1*2*3...*m)*a =k^m*m!*a接下来按照相同的方法可以求出m!中含有因子k的个数。因此就可以求除n!中因子k的个数int count(int n,int k){.
阅读全文
摘要:在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。1.加法。 如: Input: 123456789123456789123456789 1 Output:123456789123456789123456790 输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。#include<stdio.h>#include<string.h>int max(int x,int y){ if(x>y) return x; else return y;}int main(void){ ...
阅读全文
摘要:上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法:一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存储数据:for(i=1;i<=n;i++){ S[i][1]=1; S[1][i]=1;}for(i=2;i<=n;i++){for(j=2;j<=m;j++){ i f(i==j)S[i][j]=1+S[i][i-1];else if(i<j)S[i][j]=S[i][i];elseS[i][j]=S[i-j][j]+S[i][j-1];}}
阅读全文
摘要:整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};注意4=1+3 和 4=3+1被认为是同一个划分。该问题是
阅读全文
摘要:pala提出的问题:十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法? 这个问题推广一下,就是错排问题: n个有序的元素应有n!种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称这个排列为错排。 下面用递推的方法推导错排公式: 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法; 第二步,放编号为k的元素,这时有两种情况.1,把它放到位置n,那么,对于剩下的n-...
阅读全文