
C/CPP复习
文章平均质量分 51
HarryJD
这个作者很懒,什么都没留下…
展开
-
位操作(一)
int hjdfunc(int nX, int nY){ return(nX&nY+((nX^nY)>>1)));}问:hjdfunc(50, 70)返回多少?不能用笨办法,把50、70转成2进制。(nX+nY)/2,可以考虑成:(1)两个2进制数先把都是‘1’的位相加再除以2;(2)把不同的位上相加,即‘0’对应‘1’,然后再除以2;(3)前两部分相加,原创 2015-07-06 22:23:08 · 356 阅读 · 0 评论 -
判断谁说真话,谁说假话
A,B,C,D,E共5个人围成一圈,每人头上戴了一顶帽子,帽子可能是黑色或白色。戴白帽子的人说真话,戴黑帽子的人说假话。A说:我看到3个人戴白帽子,1个人戴黑帽子;B说:我看到4个人戴黑帽子; C说:我看到1个人戴白帽子,3个人戴黑帽子;D说:我看到4个人戴白帽子。E什么话都没说。编程计算出这5个人谁戴白帽子、谁戴黑帽子。 【思路】戴白帽子算做1(真),戴黑帽子算做原创 2016-03-11 16:17:36 · 3006 阅读 · 0 评论 -
Zigzag数组的初始化
zigzag数组初始化方法原创 2015-07-15 17:34:13 · 485 阅读 · 0 评论 -
函数指针(之一)——在排序算法中的应用
C语言里函数指针的使用样例。原创 2016-03-23 23:17:58 · 404 阅读 · 0 评论 -
递归---把一个整数反转处理
用递归来解决整数反转处理,只能增加一个参数 ,记录每次计算出的位数的阶。原创 2015-07-10 23:38:10 · 2472 阅读 · 0 评论 -
N皇后问题
八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。 可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。 不用二维数组,就用一个一维数组A[N],A[0]=x0表示第一列皇后在第x0行,依次A[i]原创 2016-01-02 20:43:41 · 459 阅读 · 0 评论 -
递归-解决遍历1-N的数排列输出
1,2,3,...,N,把每种排列都输出,一共有N!种排列。 例如:1,2,3,那么输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1#include #include #include int can_place(int *A, int i, int pos){ int res=原创 2016-01-07 17:44:44 · 674 阅读 · 0 评论 -
求一个字符串在另一个字符串中最右边的位置
还是K&R C语言书上的题。求一个字符串在另一个字符串中最右边的位置.原创 2016-02-14 18:02:51 · 886 阅读 · 0 评论 -
查找子串substr()函数的实现——循环
实现查找子串的substr(char *s1, char *s2)函数。如果在s1中找到了s2,就返回位置;否则返回-1。int hjd_substr(char *s1, char *s2){ int nResult = -1; int i=0, j=0; while ((*(s1+i)!='\0')&&(*(s2+j)!='\0')) {原创 2016-03-24 19:39:44 · 894 阅读 · 0 评论 -
改进版的从文本文件读取数据
找到一个比较通用的办法,从文本文件读取数据。原创 2016-03-16 22:53:16 · 390 阅读 · 0 评论 -
递归把十六进制(字符串表示)转换称十进制数
递归把十六进制(字符串表示)转换称十进制数。原创 2016-02-01 16:04:17 · 2489 阅读 · 0 评论 -
用指向指针的指针对字符串进行排序
用指向指针的指针,对字符串进行排序。指向指针的指针,就是char ** pptr啦。pptr是一个指针,指向的地址内容存储的又是指向字符串的指针。因此,首先要为pptr分配内存,存放指针,可以申请一个连续的区域来存放多个指向字符串的指针。char ** pptr;//为5个指针分配地址pptr = (char**)malloc(5*sizeof(char*));//再依次为原创 2016-11-17 11:16:17 · 1700 阅读 · 0 评论 -
N只猴子选大王(用模拟过程的方法解决)
N只猴子,围成一圈,从1开始报数,数到M的猴子退出,最后剩下一只猴子就选为大王。此题是约瑟夫环问题,可以推导出公式答案。不过,也可以用模拟过程的方法来解决。首先定义猴子结点类型:typedef struct st_Monkey{ int SN; struct st_Monkey * pNext; struct st_Monkey * pPre;}C原创 2016-02-22 17:05:27 · 1460 阅读 · 0 评论 -
有物品数量限制的背包问题
解决思路:利用递归,1...N个物品,每种有Amount[i]个,那么从第N个物品开始选择,选0个、...、Amount[i]个第N个物品,依次计算价值,找出最大的,返回。F(N) = max{ F(N-1, Lmt-n*Cost(n)) + n*Value(n), | n=0,..., Amount[i]}。#ifndef HJD_SNACKBACK_H_#define HJD_S原创 2015-07-17 20:38:34 · 4938 阅读 · 0 评论 -
位操作——循环右移n位
把一个整数,循环右移n位,输出结果。循环右移的意思是,地位右移后出现在最左边。例如:1100 0101,循环右移2位后,得到 0111 0001,最高的2bit是'01',就是原来最低2bit。一个办法是循环来解决;还有一个直接的办法,把地位n个bit直接挪到高位去。此外,如果n很大,循环了1轮以上,那么只需要考虑n相对于位宽的余数。unsigned int rotate_原创 2016-03-21 17:50:00 · 4508 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环问题是一个数学的应用问题:已知M个人(以编号1,2,3...M分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到N的那个人出列;他的下一个人又从1开始报数,数到N的那个人又出列;依此规律重复下去,直到圆桌周围的人只剩下一人。一、问题的来历 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞原创 2015-07-17 22:56:34 · 654 阅读 · 0 评论 -
递归-N个不相同的元素,输出所有可能的排列
前一个日志解决了1-N个数字的排列。假如是N个不同元素的排列,就要用到2个数组,不能简单再用变量i来模拟了。 但是,解决问题的思路是一样的,还是在每个位置上遍历所有可能,判断能否放置该元素,然后向后移动,直到结尾。//判断B[pos]的元素在A[]中是否已经出现过int can_place_1(int *A, int *B, int j, int pos){ int原创 2016-01-11 18:36:13 · 768 阅读 · 0 评论 -
字符串替换-K&R C 题3-2
把字符串中制表符(‘\t')和换行符('\n')替换为字符串“\t”和“\n”。不难,但是要注意最后要把目标字符串尾部加上’\0'结束符。int main(void){ char *s = (char*)malloc(128); strcpy(s, "Hello\tWorld. I'm a robot.\nNice to meet you."); ch原创 2016-02-05 12:40:30 · 474 阅读 · 0 评论 -
KNN-分类算法的实现
KNN算法的实现原创 2016-01-28 23:19:39 · 738 阅读 · 0 评论 -
N层楼梯上楼方式总数
有N层楼梯,每次只能上1层或2层,求一共有多少种上楼的方式。思路:最后一次上楼,可以是上1层,也可以是上2层,则F(N)=F(N-1) + F(N-2),类似斐波那契数列就很明显了。F(1)=1;F(2)=2.int F(int n){ if(n return(0); else if (n==1) return(1原创 2016-02-15 16:59:49 · 737 阅读 · 0 评论 -
排序一:快速排序
快速排序是内部排序的一种,即数据保存在内存中,而非文件中。基本思想是以一个基准值(通常选第一个数据),通过一次扫描和移动数据,让基准值右边所有的数据(无序)都比基准值大,左边的数据(无序)都比基准值小。然后再用同样的方法扫描和移动两边的数据,直到最后2个数据为基本单位,按大小排列,最终完成整个数据序列的排序。以{3, 4, 2, 1, 6, 5, 9, 8, 7, 0}为例子。第一次扫原创 2015-10-05 12:27:00 · 403 阅读 · 0 评论 -
比赛分组(二)——更通用的解法
两支乒乓球队进行比赛,各出3人,甲队有A、B、C三人,乙队有X、Y、Z三人。 A不跟X比赛,C不跟X或Z比赛。 请问应该如何分组? 思路: 前面用3个嵌套的循环来解决了问题。但是,假如参赛人数多了以后,嵌套的循环太深了。 尝试寻找更通用、简洁的办法——类似N皇后问题的解决思路,递归。 甲组可以依次固定,A先选择乙组的对手;然后B来选对手,原创 2016-03-04 18:24:24 · 548 阅读 · 0 评论 -
比赛分组问题(一)
两支乒乓球队进行比赛,各出3人,甲队有A、B、C三人,乙队有X、Y、Z三人。 A不跟X比赛,C不跟X或Z比赛。 请问应该如何分组? 思路: A依次从乙队选对手(序号设为i); B再依次从乙队选对手(序号设为j,这时A选过的对手不能再选,即 j!=i); C再依次从乙队选对手(序号设为k,这时A、B选过的对手都不能再选,即 k!=i并且k!原创 2016-03-03 22:36:20 · 1130 阅读 · 0 评论 -
从两个文件读数据,排序后输出到新文件
文件"A"和文件“B"分别已经存放有按照递增顺序排好序的小数,请将两个文件中的数据读出来写到文件”C"中,并同样按照递增顺序存入文件之中。目前想到的是设一个大数组,依次从A、B文件读入数据,然后对这个大数组排序,然后保存到C文件。有一点不满意的是,数组有尺寸限制。void bubble_sort(double *ar, int rcount);void resortToFi原创 2016-03-06 22:48:56 · 896 阅读 · 0 评论 -
求2个字符串的最长公共子串——矩阵法
有2个字符串,求它们的最长的公共子串,不是公共子序列,要连续。 例如:str1=“abcabce",str2="bcacabcgef",那么最长的公共子串为”cabc“。 最直观的办法是用矩阵法,累计记录最长子串的长度和位置。int hjd_longest_common_substr(char *str1, char *str2, char *strresult){原创 2016-03-19 22:51:45 · 596 阅读 · 0 评论 -
C的复习题(01):反转整数
C语言一些常见考题解答。原创 2015-06-30 20:34:23 · 664 阅读 · 0 评论 -
求零幺字符串的最长子串的长度——利用状态图解决
一种字符串由字符‘0’和‘1’组成,没有其他字符,以‘\0’表示字符串结束,称这种字符串为“零幺串“。计算一个输入的”零幺串“中,最长的连续‘0’或连续’1‘的长度。例如:”01110001111101“的最长连续子串是1-子串,其长度为5。可以利用状态图来理清计算思路,如下图:预设有0状态和1状态。在0状态下:(1)如果读入的字符是’0‘,那么仍然留在0状态,并且原创 2016-03-21 16:14:24 · 882 阅读 · 0 评论 -
求一条直线经过一个直角坐标系里m个点最多点的点数
typedef struct POINT{ double x; double y;}Point;输入点数和各个点的坐标:void hjd_init_points(){ printf("please input the number of points:\n"); int nM=0, nPos=0; scanf("%d", &nM); Point原创 2015-11-08 15:43:31 · 571 阅读 · 0 评论 -
[SCU2016年题]有两个已排序的单链表,合并问题
有两个单链表,已经按非减排序,要求完成两个链表的合并,也要非递减排序,并且不能使用除当前2个链表以外的存储空间。 其中,允许有重复元素存在。原创 2016-03-27 22:05:59 · 696 阅读 · 0 评论