经典算法探究
seen_in_hw
希望我能变厉害!!!成为大师!!!我放弃了很多看似很炫的技术而去探寻技术的本质,技术是用来提供服务的,所有的技术都离不开思想,而思想是最难掌握的,我们应该把更多的精力放在对于思想的探寻上
展开
-
约瑟夫环问题求解
约瑟夫问题如下: n个人围成圈,依次编号为1,2,..,n,现在从1号开始依次报数,当报到m时,报m的人退出,下一个人重新从1报起,循环下去,问最后剩下那个人的编号是多少? input: amount 队列人数 m 数到m时退出一个人output: 最后一个退出的人的下标思路:(用布尔数组做) 我们可以把这amount个原创 2015-09-05 00:44:05 · 473 阅读 · 0 评论 -
经典算法:计算两个日期之间的天数
如题所示,这个算法就是写起来麻烦一点,不过还是很简单的,思路清晰就非常好做思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为num1[] 和 num2[]; **然后就是先计算年和年之间的差距{ 相距一年:为第一年的剩下日子+第二年开始的日子 相距一年以上:为初始年的剩下日子+末尾年开始原创 2015-09-05 02:36:21 · 9106 阅读 · 0 评论 -
经典算法:X进制数转换为Y进制数
前言 我们先看一个代码例子,这是十进制数转换为任意进制数的方法 void ARY(int num,int N){ int reminder; if(num<N){cout<<num;return ;} reminder = num%N; ARY(num/N,N); //通过递归方法来输出 cout<<reminder;}如果对此段代码不明白,请参照我原创 2015-09-07 13:26:10 · 1861 阅读 · 0 评论 -
文件外部排序
问题摘要:给外部文件里面没排好序的内容排序并将排好序的文件写入文件例如: 没排序前: 排序后: 注意:我把文件是放在d:\数据.txt下面的,如果自己测试,要么更改路径,要么就要自己把要测试的文件放入该路径下。思路很简单,就是将文件读进内存,然后排个序再写回去就行了。#include <iostream>#include <fstream>using namespace std;int原创 2015-09-07 11:58:12 · 895 阅读 · 0 评论 -
将十进制数转换为二进制数
前言代码思考尾声前言题目:如何将一个十进制的数转换为二进制数?补充说明,这是我在做一个项目时发现的问题,因此顺手把这个问题给解决了一下。代码#include <iostream>using namespace std;//函数binary说明:整个函数为递归实现,其中算法由每次除二取余那种方式求二进制数,所以reminder为余数void binary(int number){ //原创 2015-08-12 16:14:53 · 4050 阅读 · 0 评论 -
【经典算法】:开灯问题,貌似没啥新解法了。。。
题目有n盏灯,编号为1~n,第一个人把所有灯打开,第二个人按下所有编号为2的倍数开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),一次类推,一共有k个人,问最后哪些灯开着?输入: 7 3 输出 : 1 5 6 7思路思路也是挺简单的,用一个布尔数组去保存灯的开关状态,为true时是开着的,false为关闭着的,然后做一次遍历即可,详情看代码原创 2015-09-29 14:06:47 · 7594 阅读 · 0 评论 -
POJ3536Beer Refrigerator
不想说啥了,又是if else 范围出错,要很明确的确定if 对的是不是else 否则就用if … else if 结构我要吐血了… 用了个scanf 和 cout的混合输入输出。。。查了两个多小时啊。。。欲哭无泪啊!服了服了附代码:#include <iostream>using namespace std;int f[30]; //这个数组要尽量开大点int main(){ in原创 2015-09-15 17:06:58 · 532 阅读 · 0 评论 -
五猴分桃问题详解
题目有5只猴子在海边发现一堆桃子,决定第二天来平分.第二天清晨,第一只猴子最早来到,它左分右分分不开,就朝海里扔了一只,恰好可以分成5份,它拿上自己的一份走了.第2,3,4,5只猴子也遇到同样的问题,采用了同样的方法,都是扔掉一只后,恰好可以分成5份.问这堆桃子至少有多少只.据说没有一个同学能当场做出答案.怎么解?(据说这道问题是李政道教授提出来的)一般性的解法然后对于这道题思考,我能给出一个公式,原创 2015-11-04 22:00:26 · 18848 阅读 · 1 评论 -
【矩阵乘法】:矩阵乘法的基本实现
问题求解关于两个矩阵的乘积解题思路:参考线性代数里面的两个矩阵相乘的规则,我这里不再赘述,详情附上了一个链接,我的编程也是用了里面的例子~~[这里写链接内容](http://baike.baidu.com/link?url=Hvf15s0bmWtvddDGKhTIwrLQ8mWOxnRDGgdOtYZEStta668P1l67SMPqsxTUFTMbmS9yoOJrswNEJsP9210cMK)具原创 2015-09-18 14:42:53 · 545 阅读 · 0 评论 -
【经典算法】:判断一个字符串是不是标志符的算法实现
废话不说,直接上代码;//// author:seen//// 2015-09-18//// 判断一个字符串是否是标识符//// 标识符的标志 第一个为字符或者下划线,其余的都为数字,字符或者下划线#include <iostream>#include <string>using namespace std;int In(char temp){ //是否在其字符原创 2015-09-18 18:07:01 · 797 阅读 · 0 评论 -
【经典算法】:求一个数的因子数
问题分析如:整数 4,有1, 4, 2 共3个因子。现在就是输入一个数num,求其因子数。方法:判断数,如果数不为1,则其因子数起码有两个,(自身和1)然后从i=2开始到sqrt(num)做循环,如果num%i==0,则因子数+2当然如果两个因子数相同,是必须要去重的思路优点由于循环做的好,没有了类似于24 = 4*6 = 6*4的这种困扰代码#include <iostream>#includ原创 2015-09-15 15:28:32 · 30619 阅读 · 2 评论 -
经典算法:分离整数各位
问题 如何求一个整数的各位方法 思考如何分离一个整数的各位,有一个公式,通过多次实验就能发现,每次用a%(10的i次方)/(10的i-1次方)这样就能得到各位,是从最低位开始分离的代码#include <iostream>using namespace std;int p_pow(int temp){ //计算10的temp次方 int sum=1; for(int i=原创 2015-09-14 23:24:09 · 3096 阅读 · 0 评论 -
【经典算法】:狐狸抓兔子问题
前言问题见百度 狐狸抓兔子问题代码全在注释里面了,没啥好说的// 狐狸找兔子问题// author:seen// time:2015-09-20#include <iostream>using namespace std;bool trek[10]; //如果trek[i]==false说明被找到void main(){ memset(trek,true,10*sizeof原创 2015-09-20 14:50:21 · 5892 阅读 · 0 评论 -
【经典算法】:关于中文在计算机存储格式的算法实现
knowledge首先要知道一些背景知识 一个字符在计算机里面使用0-255的数值表示的比如说:cout<<(int)u; 这样就能得到u的数值而中文在计算机里面是由两位负数表示的比如说 “我”这个字在计算机里面就是 -50 -46 两位数值表示的 给个代码测试一下:#include <iostream>#include <string>using namespace std;int原创 2015-09-20 16:13:06 · 747 阅读 · 0 评论 -
【编译原理】:简易的词法分析器
用途这个代码简单模拟了编译原理课上的词法分析器。词法分析器完成了 如下功能:输入一串代码: 例如 int a ; a = 3 ; 词法分析器会把各个元素给分离出来这就是词法分析器的功能实现方法通过从文件读入代码。然后程序进行自动分离单个词元素代码#include <iostream>#include <fstream>#i原创 2015-10-09 12:56:46 · 920 阅读 · 0 评论 -
【经典算法】:关于大小写的转换问题
tips:知道一点即可,所有字符都是0-255之间的值,所以大小写的转换只需要对其进行数值上面的加减运算就可以了 小写字母的值比大写字母的值大32展示一个代码: 这个就可以把a转换为大A,同理可以转换#include <iostream>using namespace std;void main(){ char a='a'; cout<<(char)(a-32`}原创 2015-09-20 20:51:56 · 1139 阅读 · 0 评论 -
【模式匹配】:关于模式匹配的算法实现2
前言在上篇博客中,我完成了这么一个功能,输入一个单词的混序,然后从数据字典中查找该单词。于是我当时想到一个问题: 我输入的混序词应该是要和被查找的单词是等长的,如果不等长,那么怎么查询?这就是我这篇博客的由来. 举个例子: 查找apple,在上篇我需要输入a p p l e五个字符的混序输入, 在这篇文章实现的算法中,我只需要实现输入 a p p 即可,这样它的匹配率会达到0原创 2015-09-20 13:15:48 · 573 阅读 · 0 评论 -
【经典算法】:关于硬币称重问题及编程实现
好吧,我承认我是被室友坑了,突然在寝室讨论起这个,从晚上9点多一直搞到了现在,才搞完+_+,不是彻底,但是搞定了大部分的问题问题1,4硬币称重问题 2,8硬币称重问题 3,12硬币称重问题传送门:关于问题的解12硬币问题及解: 12个硬币不知轻重如何用三次称出来? 解法:(要看挺久才能明白) 传送门:解法传送门代码实现:(都聚在一起了) 8枚硬币的没写,因为跟4枚硬币差不多,注意几个程序原创 2015-09-21 00:01:33 · 6441 阅读 · 0 评论 -
经典算法探究:计算某日期是星期几
思路: 设定一个原始日期,及其为星期几,为了保险起见,我设定1900一月一日 为礼拜一,日期表上也是如此。然后计算 输入的日期 与 1900 之间的天数,然后用天数%7 ,其余数分别代表了礼拜几,如果为0,说明是礼拜天。注:计算天数参考我上篇博文,附链接: http://blog.csdn.net/qq_23100787/article/details/48219005然后在如下板块做相应修改:原创 2015-09-07 11:09:37 · 1611 阅读 · 0 评论 -
【智能查询】:关于智能查找输入的算法实现1
问题描述在生活中我们总有这样的情况,比如说不记得某个单词,然后就大概的去查找该单词,这样就会导致输错的情况,这篇文章实现的算法就是想让用户在输错的情况下如何也能智能匹配到该单词。举个例子:字符串为apple 我输入了pplea,这样五个字母都是一致的,只是顺序不一样而已,因此能够认为该用户输对了单词,进行准确的查找可以参照:刘汝佳 算法入门 字符串模块等章节解题思路对字符串进行处理,想要查找到原创 2015-09-20 11:34:09 · 717 阅读 · 0 评论 -
【经典算法】:ASCII码打印的算法实现
前言首先要明白一个问题,就是0-255的字符对应着相应的字符,比如说 65对应着大写的A知道了这个代码就好写了,几行就能搞定代码#include <iostream>using namespace std;void main(){ for(int i=0;i<255;i++){ cout<<(char)i<<" "<<i<<endl;//把数字强转为字符即可原创 2015-09-22 12:11:59 · 887 阅读 · 1 评论 -
【算法竞赛】:最小周期串
题目如果一个字符串可以由某个长度为K的字符串重复多次得到,我们说该串以K为周期,例如: abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期思路思路其实已经体现在题目中了,假设一个周期,然后满足的条件是周期肯定被串长度整除,然后从最小的开始遍历,其中遍历时满足后面每个周期里的数都和第一个周期相同,就输出该周期,该周期肯定是最小的。仔细看代码原创 2015-11-12 13:53:31 · 881 阅读 · 0 评论 -
【经典算法】:原码,反码,补码之间的转换问题
背景知识补充正数:原码=反码=补码 负数:原码 反码 补码之间 转换有规则(下面讨论) 0:分为+0 和 -0去考虑,符合上面那两条规则补充一个概念叫做符号位,把每个数第一位当作符号位,取0为整数,取1为负数对负数的讨论: 1,原码到反码 除符号位 全部 翻转 比如说: 原码:100001 反码应该为 111110 (后面五位全部翻转) 2,反码到补码(可以不看,直接看第三条比较简单原创 2015-09-24 00:29:36 · 4377 阅读 · 2 评论 -
【经典算法】:爱因斯坦台阶问题
爱因斯坦台阶问题爱因斯坦曾经提出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩下1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩下4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。请问该阶梯至少有多少阶。解题思路不是很简单吗?就是找一个i满足上述规则即可,从小的开始找呗,找到第一个最小的输出就完事了 =_=代码//爱因斯坦台阶问题#include <iostrea原创 2015-11-20 17:16:14 · 12504 阅读 · 0 评论 -
【经典算法】:用递归求1*2*3*...*n
题目如题所示解题思路比较简单的递归,思路有点同我之前的走楼梯问题代码#include <iostream>using namespace std;int fun(int i,int pos,int n){ //用i记录增量,用pos记录结果,估计我以后写的递归代码都会如如此了 = = if(i==n){ return pos; }原创 2015-11-23 01:01:02 · 5271 阅读 · 0 评论 -
【经典算法】:求一个字符串的主元素(o(n)复杂度)
这里举个例子 主元素,就是超过全部一半的元素。算法思路说起来挺费劲的 - -就是设置一个变量和后面的相比较,如果相等,设置count++; 不相等count–;当count = 0时更新变量这个基于最基本的原理就是主元素超过总元素的一半这里附上代码:#include <iostream>using namespace std;int main(){ char str[50],temp原创 2015-12-28 23:05:34 · 880 阅读 · 0 评论 -
【经典算法】:如何判断整数和浮点数是否相等
这个问题来自于我解决一个叫做五猴分桃的问题 其中会出现这么一些数据 我需要在右边第二栏数据里面找到整数型的数据,比如说 3121这类的数据但是我给第二栏定义的是float型的数据,如何判断这个float型的数据是不是整数呢?用了如下方法,注意看!!! int fun(float num){ int temp = (int)num; if(temp==num) return原创 2015-11-04 15:57:11 · 4955 阅读 · 0 评论 -
【经典算法】:欧几里得算法求最大公约数
前言欧几里得算法就是一个叫做欧几里得的数学家提出来的一种算法用来可以计算两个数的最大的公约数,和最简单的那种枚举不同,这种算法有种巧妙的计算。 当然,我们不是数学家,只是计算机从业者,因此对于算法的详细证明就不说了,就只写写简单的算法算法核心算法 gcd(m,n) = gcd(n,m%n); 反复利用这个公式,建立的前提是m>n; 最后结束的条件是 n ==0 ;代码实现这里有递归和非递归版本原创 2015-12-17 10:11:00 · 1198 阅读 · 0 评论 -
【经典算法】:最长公共子序列(LCS问题,用遍历实现)
题目给出两个字符串,求两个字符串的最长公共子序列思路对两个字符串任意一个字符串s1进行遍历,然后查找s2中与s1[i]相同的位置,每次相同时就同时设两个变量pos1,pos2记录下位置然后往后比较,一直比较到不相同的时候为止,记录下来这个串的长度max。每次得到max之后和之前的公共子串长度相比较,如果大于之前的,就把这次的子串长度设为是最长的按照上述思路逐步进行,最后得到一个最长的子串以及其初始位原创 2015-11-27 17:22:47 · 734 阅读 · 0 评论 -
【经典算法】:希尔排序的实现
希尔排序我感觉并没有什么用 = =因为希尔排序事实上是对插入排序的一个复杂化,在插入排序的基础上引入了一种分组机制,所以这种排序事实上是复杂了。并且这种排序和插入排序的实现机制非常相似,只要稍微增加一点分组的代码,然后再进行分组插入即可 = =参考我上篇文章的插入排序:http://blog.csdn.net/qq_23100787/article/details/50054773原创 2015-11-26 13:49:58 · 792 阅读 · 0 评论 -
【经典算法】:插入排序的实现,通过交换,与众不同!
前言在我的博客里面,我前面写了一篇关于插入排序的实现报告,这篇报告中规中矩,就是最基本的那种插入排序,一个函数起码也得写的估计有20多行代码,然后今天突然灵感一来,发现一种更加高效的方法,然后撰一篇文以记之,希望大家能够喜欢。 附上我的上篇插入排序博文链接: http://blog.csdn.net/qq_23100787/article/details/48159551介绍插入排序无非就是这样原创 2015-11-26 13:30:33 · 1274 阅读 · 1 评论 -
【经典算法】:英雄联盟中打字屏蔽系统的实现
前言在玩英雄联盟中玩家经常会出现这种问题,喜欢打字喷人,比如说喜欢喷人说:操你妈,狗日的,操了。你妈逼的,傻逼等。。。。这里会出现一个词语叫做高频词汇,比如说上述那些词语就是如此,上述词语会被系统自动替换成*号、举个例子:输入“我操你妈逼啊”因为系统会把操你妈认为是高频词汇,所以输出:我*逼啊 懂了吧,是不是好简单具体实现过程首先要大胆的猜测一下英雄联盟真实的打字屏蔽系统是怎么样子的。 我觉得是原创 2015-11-25 00:39:00 · 3192 阅读 · 2 评论 -
【面试题】:全排列
前言全排列问题网上一搜一大堆,我这里也是写的中规中举,没有什么出彩的地方。这里只是告诉大家,全排列见人见智,首先自己多想想肯定是好的,然后自己试着编码也是挺好的。全排列有递归和非递归两种解决方案,我这里用的是递归的方法,递归的调用就是一个排列后面的所有数都和这个数进行交换思路如上,递归难懂,需要自己多想想代码#include <iostream>using namespace std;void原创 2015-11-24 13:22:42 · 567 阅读 · 0 评论 -
【经典算法】:二分查找
前言二分查找这种老生常谈的话题,说的很简单,但是仍然有些大伙不明白,所以这里希望自己能够写出一篇很浅显易懂的博客帮助大家理解二分查找的规则给定数组已经排序好,然后对其进行编号。这里我们默认是从小到大的,否则算法就要进行更改了 = =思想: 因为数组是有序的,所以每次和数组中间的一个比较,通过和其大小的关系,然后再折半比较 疑问:我想很多同学不明白的是为什么这种方式就能满足一定能查找出想要的结果。原创 2015-11-23 00:43:25 · 1908 阅读 · 2 评论 -
【经典算法】:硬币组成问题
题目给出1角,2角,五角的硬币,求构成一块钱,一共有多少种方法?思路做一次三重遍历即可,每有满足的条件时,就把统计的结果输出即可,详细见代码代码//x代表1角硬币,y代表2角硬币,z代表5角硬币,count记录了满足的次数#include <iostream>using namespace std;int count=0;int main(){ for(int x=0;x<=10;x原创 2015-11-20 17:21:09 · 1529 阅读 · 0 评论 -
【算法竞赛】:进位数统计
题目给出两个数a,b,例如a=123,b = 456这两个数,算出这两个数相加过程中产生了多少次进位?思路思路就是最简单的,从个位开始加,然后算出每次算完的进位用c来存储,c只能为0或者1,然后算完之后C更新,如果C==1,表示有进位,然后全局变量ans(存储最终进位结果的)++;技巧性的东西在于如何用一个简单的循环做到从个位数相加? 请详细看代码 可能上段说的不是很明白,但是看了代码就懂了原创 2015-11-12 14:14:31 · 906 阅读 · 0 评论 -
【算法竞赛】:分数拆分
题目输入正整数K,找到所有的正整数x>=y,使得1/k = 1/x+1/y 样例输入: 2 12 样例输出: 思路:对等式进行化简,然后得到K,x,y的一个关系式: x = k*y/(y-k); 然后对y进行遍历,y肯定是大于k小于等于2*k,这个可以通过那个公式判断 然后遍历时候算出x,如果算出X为整数切X大于等于Y,则输出结果 = =代码// author:seen/// 算法原创 2015-11-12 14:02:25 · 1500 阅读 · 0 评论 -
【经典算法】:基于中文字符分析的统计频率算法实现
前言//这篇文章和我的上篇文章 :英文频率统计 //息息相关,可以作为参考正文:在生活中,我们会有这样的困扰,比如说要统计一篇作文中 某个字符出现的次数,该咋办?人工肯定会这么弄,把一篇文章从第一个数到最后一个,然后统计出来这样确实不错,但是当文章足够大时就显得特别费劲,并且特别笨重,所以就一定要智能的完成这个功能,这篇文章所介绍的技术就是这个,当然基于这个基础还能干很多的事,这得需要探讨才能发现原创 2015-10-11 23:07:11 · 2375 阅读 · 2 评论 -
【经典算法】:英文文章统计字符频率
题意解析比如说我存了一些字符在txt文件里面,比如说 a.txt 里面存了 abc edf ccdef 字符这样这个程序能够实现统计文件里面有多少字符,多少种字符,每个字符出现的频率上个例子应该是 11个字符 6种字符,a 1个 b 1个 c 3个 d 2个 e 2个 f 2个实现思路1)读入文件存进char 数组里面去 2)对单个字符进行分析,如果是出现过的就进行单个的统计放到原创 2015-10-11 18:01:58 · 3771 阅读 · 0 评论 -
【经典算法】:银行金额大写转换
说明//你很可能看不懂我写的什么,但是代码可以直接用,不用谢我这篇文章的起因是我想写一个编译原理的工具,后来我顺便想到了字符对应,于是我脑洞大开,就想到了这个银行大写金额转换的工具。思路跟我的上篇博客那个罗马数字的转换也是一回事噢,对了,为了防止来到本博客的小伙伴还不知道我讲的什么,我决定讲下这个程序的功能。 实现了 把银行票据上的数字转换为中文金额比如: 输入31655427 就会显示 叁仟壹原创 2015-10-09 15:05:28 · 1378 阅读 · 0 评论