算法
闲敲代码、落灯花
坚持写博客,一直在努力中
专注后端开发,喜欢Go和Python的PHP程序员,作为一个前端爱好者,对服务器运维比较有经验
同时也是一个个人站长:在网站:逐步前行STEP[https://www.hezehua.net] 记录我的工作与生活
展开
-
算法--大数开方
之前已找到比较好的大数乘法算法,现在我们来解决大数开方问题,如有大数n,求其开方x,则x与n必满足x*x=n;也就是说我们能遍历x找到n的开方,但是问题在于我们是不可能对大数遍历的。如果我们可以确定它的大致范围,仅仅测试几个不容易直接判断的数据就找到目标数据就好了。 1-一个n位数的开方的位数m满足下列条件: m=n/2(n为偶数); m=n/2原创 2015-03-31 21:48:18 · 6855 阅读 · 0 评论 -
生成子集——二进制法
用二进制位的0和1表示集合中是否存在该元素要生成0~n的子集,先生成0~n的二进制序列,这些序列的0、1位正好可以对应一个子集中全集在该位置上的元素是否存在,将其作为子集中存在的元素的标记,输出对应元素。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>using namespace std;void原创 2016-03-18 10:53:34 · 2584 阅读 · 0 评论 -
生成子集——位向量法
生成0~n序列的子集对于0~n的每一个值在集合中都有存在和不存在两种状态,所以递归每个值的存在状态即可生成子集#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<algorithm>using namespace std;void sutset(int n,int *b,int cu原创 2016-03-18 10:30:03 · 715 阅读 · 0 评论 -
子集生成算法——增量构造法
思路是一次选出一个元素放入集合中生成0~n的子集,每次选出最小的值放入集合中,通过从0递增得到下一个位置的值。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<algorithm>using namespace std;void sutset(int n,int* a,int cu原创 2016-03-18 10:15:07 · 2426 阅读 · 1 评论 -
用大数乘法计算阶乘
在比较小的范围内阶乘可以递归实现,而求更大的数的阶乘一般用到long long长整形数,不过,即使这样,在耗时和再大些的阶乘上力有不逮,所以,在输入比较大的情况下,用大数乘法计算阶乘是最好的选择。 计算过程分2步: 1、输入字符串s,将它的值保存到整型n中; 2、从1~i~n-1循环将i转化为字符串并和s做大数乘法,每次将结果保存在字符数组r中,r初始化等于s,在计算过程中动态开辟的空间大小是原创 2016-03-18 09:05:22 · 610 阅读 · 0 评论 -
大数乘法(一)
常用的大数相乘算法有模拟加减法和分治法,第一种符合我们的运算习惯,第二种用数学方法提高了效率,(具体描述与实现可参考http://www.cnblogs.com/heyonggang/p/3599857.html)而两种各有优势的方法的程序实现都比较复杂,并且不易于初学者理解,于是我琢磨出了一个将它们合二为一的方法,而且其原理通俗易懂,所编程序也较简单。 首先,通过一个例子来展示我原创 2015-03-29 14:26:31 · 1433 阅读 · 1 评论 -
大数乘法(二)
乘法运算过程模拟法首先获取输入的乘数(a)与被乘数(b)字符串,按一般乘法运算过程,先是a的最后一位数字与b的最后一位数字相乘,接着a中用于相乘的数下标递减,直到a中所有数字与b最后一位都相乘过,保存结果后再递减b中的用于相乘的数字的下标,循环下去,直到b中每一位数都与a所有数相乘完。在这个过程中,怎么遍历出填放结果的位置和处理进位是关键。 #include<stdio.h> #i原创 2016-03-17 22:29:09 · 480 阅读 · 0 评论 -
大数加减
太残忍,半个月不做题,就对题目毫无感觉了,明明思路正确清晰,但敲的代码满满的bug,连输入字符串前要开辟空间都能无视。。。还在输入后就清空了却在后面一个劲的对它操作。。。略怀悲伤地把代码改好了。#include<stdio.h>#include<math.h>#include<ctype.h>#include<string.h>#include<stdlib.h>int main(){原创 2015-11-29 12:38:48 · 495 阅读 · 0 评论 -
算法--库函数实现全排列
c++的STL中提供了一个库函数next_permutation,代码如下:#include#include#include#include#include #includeusing namespace std;int main(){ int n,p[10]; scanf("%d",&n); for(int i=0;i<n;i++)scanf("%d"原创 2015-04-05 20:34:02 · 969 阅读 · 0 评论 -
算法--八皇后问题
在棋盘上放置8个皇后,使得他们不能相互攻击,此时,每个皇后的攻击范围为同行同列和同对角线,要求找出所有解,回忆之前分析生成排列所用的解答树,我们再把问题简化为四皇后问题,规则不变,写出它的完整解答树与生成1~n的排列这篇博文中的解答树最大的不同点就是----只有一条或者几条路径可以到达最后一层,而其它的路径在递归时因为条件不满足被回溯了,这也称为回溯法。本题代码如下:/原创 2015-04-05 21:19:10 · 612 阅读 · 0 评论 -
算法--生成1~n的排列
在暴力求解法中,我们常常要用上枚举一些简单内容以便方便获得解,若要输出整数n的前n个整数的全排列,则按字典序输出为:(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。从中我们似乎发现了一些规律:先输出以1开头的排列,再输出以2开头的排列,然后是3;而在以1开头的排列中,1的后一位又是按从小到大的顺序出现,这似乎有些递归的联系。事实上,我们分原创 2015-04-05 19:54:55 · 1813 阅读 · 1 评论 -
算法--生成可重集排列
在生成1~n的排列一文中,我们获取排列时用了控制不相等来实现让每个数都不重复地出现,所以如果要生成含有重复元素的全排列,对对生成1~n的排列的程序适当修改即可。首先,把各个元素改成用户输入,输入数组为p,然后把if(a[k]==j)改为if(a[k]==p[j]),a[cur]=j改成a[cur]=p[j],然后先把p数组中元素用模板函数sort()按从小到大排个序,接下来要更改原程序中控制元原创 2015-04-05 19:58:07 · 753 阅读 · 0 评论 -
动态规划入门之国王的金矿
最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.net/woshioosm/article/details/7438834),下面我用自己的记忆和理解讲讲我对动态规划的一点小心得。 首先,动态规划方法适合的题型4个基本特点是: 1、最优子结构,当前一转载 2016-03-19 10:16:10 · 7647 阅读 · 0 评论