
常用算法汇总
文章平均质量分 76
benpaobagzb
做人要谦虚
展开
-
约瑟夫环问题
约瑟夫环问题:有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始, 如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。对于这个问题,有很多解法。包括一些基本的解法和一些优化的算法。基本解法一:这个方法比较直观,就是使用循环列表来模拟约瑟夫环。但是复杂度比较高,为O(m*n) 具体的代码如下:/* * ==原创 2015-09-14 16:54:32 · 378 阅读 · 0 评论 -
领会一些比较巧妙的算法
昨天看到了一些比较巧妙的算法,觉得挺不错的。参考:http://blog.youkuaiyun.com/csdn_zc/article/details/67769291. 素数判断 作者给出了几种方法。 方法一:int isPrime(int n) //函数返回1表示是质数,返回0表示不是质数 { int i; for (i = 2;原创 2015-09-14 16:53:26 · 1120 阅读 · 0 评论 -
如何判断整数x的二进制中含有多少个1
主要是利用位操作来判断每一位是否为1方法一:清除整数a最右边的1可以使用这个操作:a&(a-1) 所以可以利用这个方法来得到1的个数:int count_one(unsigned x){ int count=0; while(x){ count++; x=x&(x-1); } ret原创 2015-09-14 16:59:53 · 558 阅读 · 0 评论 -
三种算法求解一个数组的子数组最大和
题目:要求一个数组连续下标和的最大值,数组的元素可正、可负、可为零,例如-2,5,3,-6,4,-8,6将返回8。这题是很经典的一道面试题,也有各种解法,从算法分析上,时间复杂度也有很大差别,下面我就给出三种不同的解法。方法一:暴力枚举法此种方法最简单,我想应该也是每个人拿到题目想到的第一种解法了,学过一点编程的人都应该能编出此类程序。记sum[i..j]为数组中第原创 2015-09-14 16:57:24 · 479 阅读 · 0 评论 -
计算平方根的算法
总结一下一些常用的计算平方根的方法1. 牛顿法具体的做法如下: 计算公式如下: 具体的计算程序如下: double sqrt_(double x) { double g=x; while(ABS(g*g-x)>0.000001) { g=(g+x/g)/2;原创 2015-09-14 16:56:05 · 1284 阅读 · 0 评论 -
C Primer Plus
这是《C Primer Plus(第5版)》的一些阅读笔记,以后可以经常看看,复习一下C语言。第一章 概览1. 目标代码、可执行文件和库 2. 编译器环境 (1)Unix系统上所用的编译器是cc(2)Linux系统上使用gcc编译器(3)window上一般是提供的集成编程环境IDE (4)IBM PC的DOS编译器原创 2015-09-14 17:21:50 · 1049 阅读 · 0 评论 -
C语言接口与实现[+]
第1章 简介1. literate程序2. 宏指令与条件编译指令第2章 接口与实现1. 接口与实现的关系2. Arith接口及实现:arith.h:/* $Id: H:/drh/idioms/book/RCS/inter.doc,v 1.11 1997/02/21 19:42:15 drh Exp $ */extern i原创 2015-09-14 17:16:04 · 3104 阅读 · 0 评论 -
排列组合算法
排列组合是常见的一个问题。1. 排列算法这个主要采用递归的方法来解决。 具体代码如下:void swap(int& a,int& b) { if(a==b) return ; int t=a; a=b; b=t原创 2015-09-14 16:58:58 · 428 阅读 · 0 评论 -
C程序设计-现代方法
《C程序设计-现代方法》这本C语言书是一本不错的C语言的书。其中的讲解挺有条理,并且每章后面的释疑部分真的解答了我的很多疑问。第2章 C语言基本概念1. 在某些C语言的书中,main函数的结尾使用的是exit(0),而不是return 0,二者是否一样? 当出现在main函数中时,这两种语句是完全等价的:二者都终止程序执行,并且向操作系统返回0值.2. float类型的名原创 2015-09-14 17:24:29 · 1191 阅读 · 0 评论 -
算法题集-1
下面几个算法题是摘自《C语言实战105例(2006)》。但是有些解答开始没有看懂,然后从网上找了一些解答。1.储油问题 20程序如下:#include#define MAX_STATION_NUM 32 /*定义最大允许的储油点数目*/int main(){ int k,i; flo原创 2015-09-14 17:07:53 · 1186 阅读 · 0 评论 -
原地归并算法
归并排序算法(mergesort)是将一个序列划分为同样大小的两个子序列,然后对两个子序列分别进行排序,最后进行合并操作,将两个子序列合成有序的序列.在合成的过程中,一般的实现都需要开辟一块与原序列大小相同的空间,以进行合并操作。这儿有比较全的排序算法:http://www.cnblogs.com/xkfz007/archive/2012/07/01/2572017.html 之前使用过的归并原创 2015-09-14 17:04:30 · 746 阅读 · 0 评论 -
剑指Offer-第2章 面试需要的基础知识
面试题1: 赋值运算符函数一般的写法是如下形式: CMyString& operator=(const CMyString& str){ if(this!=&str){ delete[] m_pData; int sz=strlen(str.m_pData);原创 2015-09-14 17:09:45 · 409 阅读 · 0 评论 -
序算法时间测试比较
之前介绍过常见的排序算法,可以查看这里之前实现的代码都是针对int型的算法,现在我将代码改写成了模板,这样可以应用于常见的一些类型。为了测试比较不同的排序算法,采用了两种计时方式。注意,下面的两段代码中,void(*_sort[])(T*,int) 是函数指针数组。1. 采用clock函数,统计排序算法所使用的时钟数代码如下: template c原创 2015-09-14 17:03:06 · 432 阅读 · 0 评论 -
字符串循环移位
首先,先看看如何对数字进行循环移位C语言中没有提供循环移位的操作符,但可以通过简洁的方式实现循环移位,主要使用移位操作来实现。设一个操作数x有s位则循环左移n位的操作为:(x > (s - n));同理右移n位位:(x >> n) | (x 实际编程中可以用宏定义实现循环移位:#define ROTATE_LEFT(x, s, n)原创 2015-09-14 16:58:13 · 586 阅读 · 0 评论 -
判断出栈序列是否合法
部分内容来自互联网: 【问题描述】对于一个栈,已知元素的进栈序列,判断一个由栈中所有元素组成的排列是否是可能的出栈序列。比如,进栈序列为1 2 3 4,则可能的出栈序列有4 3 2 1,1 4 3 2等。而1 4 2 3就不是。【输入形式】从标准输入读取第一行是一个整数N(3≤N≤10),代表有N个元素,其进栈序列是1 2 3 …… N。第二行是空格分隔的1~N的数字的一个原创 2015-09-14 16:55:15 · 1667 阅读 · 0 评论 -
C与指针
第2章 基本概念1. 程序的执行过程经历几个阶段:首先是载入到内存中。在宿主环境中(具有操作系统的环境),这个任务由操作系统完成。那些不是存储在堆栈中的尚未初始化的变量将在这个时候得到初始值。在独立的环境中,程序的载入必须由手工安排,也可能是通过把可执行代码置入只读内存(ROM)中来完成。然后程序执行便开始。在宿主环境中,通常一个小型的启动程序与程序链接在一起,它负责处理一系列日常事务原创 2015-09-14 17:25:58 · 394 阅读 · 0 评论