05 2012 档案

摘要:首先,先看看如何对数字进行循环移位C语言中没有提供循环移位的操作符,但可以通过简洁的方式实现循环移位,主要使用移位操作来实现。设一个操作数x有s位则循环左移n位的操作为: (x << n) | (x >> (s - n)); 同理右移n位位:(x >> n) | (x << (s - n));实际编程中可以用宏定义实现循环移位: #define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n))) #define ROTATE_RIGHT(x, s, n) ((x 阅读全文
posted @ 2012-05-20 16:26 Mr.Rico 阅读 (1306) | 评论 (0) 编辑
摘要:今天在网上看到这个问题,自以为的输出是3.0,但是实际去跑一下,可以发现结果是0.0000这一句虽然不长,但是其中蕴涵的知识点是很多的。第一,10/3的结果是什么?这个很显然结果应该是3第二,printf语句格式化输出的使用%f就是要输出浮点数,但是我们也发现给的参数其实是个整型数。所以也就出现了上面的结果。第三,printf的原理是什么?这儿就牵扯到C中的不定参数的使用方法。具体可见这儿 简单来说就是,printf从栈中取参数的时候是根据格式化语句中要求进行取数的。这儿是%f,而浮点数是4个字节(32位操作系统),所以,要从栈中取4个字节,并且是按“浮点数的方式”。正好,参数3是个整型数,. 阅读全文
posted @ 2012-05-18 20:08 Mr.Rico 阅读 (1715) | 评论 (1) 编辑
摘要:题目:要求一个数组连续下标和的最大值,数组的元素可正、可负、可为零,例如-2,5,3,-6,4,-8,6将返回8。这题是很经典的一道面试题,也有各种解法,从算法分析上,时间复杂度也有很大差别,下面我就给出三种不同的解法。方法一:暴力枚举法此种方法最简单,我想应该也是每个人拿到题目想到的第一种解法了,学过一点编程的人都应该能编出此类程序。记sum[i..j]为数组中第i个元素到第j个元素的和(其中0<=i<j<=n-1),通过遍历所有的组合之和,就能找到最大的一个和了。伪代码如下:int maxSubArray(int *A,int n) { int maxium = -INF 阅读全文
posted @ 2012-05-17 15:21 Mr.Rico 阅读 (12017) | 评论 (2) 编辑
摘要:计算某一天是星期几的公式如下: W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D.其中Y是年份,D是改天是Y年的第几天。具体的解释见这儿 具体代码如下:#include<iostream>#include<string>#include<sstream>usingnamespacestd;constintMONTH[12]={31,28,31,30,31,30,31,31,30,31,30,31,};conststringWEEK[]={"SUN","MON", 阅读全文
posted @ 2012-05-17 00:00 Mr.Rico 阅读 (250) | 评论 (0) 编辑
摘要:为栈实现高效的max操作 题目: 请设计一个栈,除了提供push(压栈),pop(出栈),peak(取栈顶元素)操作以外,还能提供max(取栈中最大值)的功能,并使得时间复杂度最小。注:请仔细思考后再看下面的答案1. 方案一(不可行)设计一个成员max,等于栈中最大的元素,在每次push操作后,新压入的元素与max比较,然后将max赋值为它们中的大的元素值。这样,max函数则返回max。问题:如果栈中等于max的元素pop出去后,该max就不是栈中的最大值了。2. 方案二(可行,效率太低)在【方案一】的基础上改进,每当栈中等于max的元素pop出去后,则把剩余元素依次pop到临时数组,找出最大 阅读全文
posted @ 2012-05-16 22:51 Mr.Rico 阅读 (299) | 评论 (0) 编辑
摘要:交换两个整型数是C/C++中最常见的操作。实现这个操作的方法很多。最基本的方法就是使用一个临时变量,具体的代码如下:inta,b;inttmp;tmp=a;a=b;b=tmp;如果以函数的形式写出来的话就是:voidswap(int*a,int*b){inttmp;tmp=*a;*a=*b;*b=tmp;}在C++中,可以使用引用来实现的比较优雅:voidswap(int&a,int&b){inttmp;tmp=a;a=b;b=tmp;}另外,还经常出现的一种情况是不使用临时变量来交换两个整型数,一般常见的方法有两种:加法和异或运算,具体如下表所示: ... 阅读全文
posted @ 2012-05-16 20:38 Mr.Rico 阅读 (12607) | 评论 (2) 编辑
摘要:总结一下一些常用的计算平方根的方法1. 牛顿法具体的做法如下: 计算公式如下:具体的计算程序如下: doublesqrt_(doublex){doubleg=x;while(ABS(g*g-x)>0.000001){g=(g+x/g)/2;}returng;}2. 利用级数进行逼近微积分中的泰勒级数如下:这样,有了这个公式我们可以得到求平方根公式的展开式: 这样我们可以进行在一定精度内的逼近。但是这儿存在一个问题,就是这个公式的收敛问题。它是存在收敛区间的。 所以可以得到最后的代码:doubleTsqrt(doublex)//计算[0,2)范围内数的平方根{doublesum,coffe 阅读全文
posted @ 2012-05-15 22:34 Mr.Rico 阅读 (23187) | 评论 (0) 编辑
摘要:C语言提供类似于矩阵的多维数组,在一些进行数学运算的程序中会经常用到。从形式 上看多维数组是由多个一维数组组成的,但C语言处理多维数组的方法和一维数组一样,都是线性存储,连续分配存储空间,可以用带偏移量(offset)的一 维数组来访问多维数组。而在数组规模不确定的情况下,就需要用malloc函数动态分配存储空间。这里的数组规模不确定指的是数组的维数确定,而每一维的 元素个数是不确定的。例如根据用户输入的行数和列数来确定一个二维数组。下面使用两种方式来进行二维数组分配:对应的代码如下: #include<stdio.h>#include<stdlib.h>#define 阅读全文
posted @ 2012-05-14 11:01 Mr.Rico 阅读 (557) | 评论 (0) 编辑
摘要:1. 存储及退出文件:wq或者:x 存文件,并且退出viZZ 保存并退出(:x 表示仅在需要时保存,ZZ不需要输入冒号并回车) ZZ = wqZQ 无条件退出:e filename 打开文件filename进行编辑[相当于退出当前的并打开另一个文件]:e! 放弃修改文件内容,重新载入该文件编辑:e 重新载入【类似刷新】ctrl+z/fg 暂时挂到后台/跳回编辑页面:f 或 Ctrl-g 显示文件名及一些其他信息:!command 暂时退出vi并执行shell指令,执行完毕后再回到vi:r!command 将命令command的输出结果放到当前行【强大】vim -x exam.txt 新编辑的文 阅读全文
posted @ 2012-05-11 22:07 Mr.Rico 阅读 (794) | 评论 (0) 编辑
摘要:c++类的构造函数详解 一、 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_value; } 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作 eg:Counter c1; 编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象c1的m_value... 阅读全文
posted @ 2012-05-11 17:50 Mr.Rico 阅读 (79508) | 评论 (11) 编辑
摘要:使用Memoization,以避免递归重复计算考虑Fibonacci(斐波那契)问题;Fibonacci问题是可以通过简单的递归方法来解决:intfib(n){if(n==0||n==1){return1;}else{returnfib(n-2)+fib(n-1);}}注:在这里,我们考虑Fibonacci 系列从1开始,因此,该系列看起来:1,1,2,3,5,8,... 注意:从递归树,我们计算fib(3)函数2次,fib(2)函数3次。这是相同函数的重复计算。如果n非常大,fib这个简单的技术叫做Memoization,可以被用在递归,加强计算速度。fibonacci 函数Memoizat 阅读全文
posted @ 2012-05-08 10:39 Mr.Rico 阅读 (3940) | 评论 (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的数字的一个排列。 【输出形式】向标准输出打印结果。如果该排列是可能的出栈序列,则打印“YES”, 否则打印“NO”。在行末要输出一个回车符。 【输入样例】 3 3 1 2 【输出样例】 NO 【样例说明】进栈序列为1 2 3.. 阅读全文
posted @ 2012-05-07 15:07 Mr.Rico 阅读 (816) | 评论 (0) 编辑
摘要:1.linux 链接库介绍在linux系统中,可将多个目标文件打包成库文件,以便在编程时随时调用,而不必重新编写或定义,这种包称为库函数。库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(curses库)等。 1.基础知识:linux下GCC在编译程序时要经历预处理,编译,汇编和连接四个阶段。 (1). 预处理阶段,主要处理#include和#define,它把#include包含进来的.h 文件插入到#include所在的位置,生成.i文件; (2). 编译阶段,是最重要的阶段,在 阅读全文
posted @ 2012-05-01 21:55 Mr.Rico 阅读 (3388) | 评论 (1) 编辑
摘要:《Linux 程序设计》是一本非常好的书,内容很全面,并且对于给出的例子都进行了详细的讲解。并且是通过一个的小型的项目的来讲解的:开始是使用shell进行编程实现,然后逐步进行改进,使用C语言实现,使用ncurses库实现,改用dbm数据库,改用MySQL数据库,添加套接字,最后是使用GTK和Qt添加了图形界面,所以非常的值得仔细的看。第1章 入门1. 什么是UNIX 2. GNU项目 3. linux程序 第2章 shell程序设计1. 内部命令与外部命令 2. exec命令 第3章 文件操作1.unix和linux中比较重要的设备 2. 系统调用与设备驱动程序 2.库函数 3. wr... 阅读全文
posted @ 2012-05-01 17:24 Mr.Rico 阅读 (909) | 评论 (0) 编辑