05 2011 档案

变长参数表
摘要:以实现函数printf的一个最简单版本为例,介绍如何以可移植的方式编写可处理变长参数表的函数。因为我们的重点在于参数的处理,所以,函数minprintf只处理格式字符串和参数,格式转换则通过调用函数printf实现。 函数printf的正确声明形式为:int printf(char* fmt, ...) 其中,省略号表示参数表中参数的数量和类型是可变的。省略号只能出现在参数表的尾部。因为minprintf函数不需要想printf函数一样返回实际输出的字符数,因此,我们将它声明为下列形式:void minprintf(char* fmt, ...) 编写函数minprintf的关键在于如何处理. 阅读全文

posted @ 2011-05-29 23:46 NULL00 阅读(875) 评论(0) 推荐(0)

编程珠玑-位排序(bitsort)
摘要:在《编程珠玑》一书上,有一题是将一堆不重复的数进行排序,这些数的值大小位于[0, 10000000).然后作者在书后给出的答案确实很精辟,利用位排序将这个问题轻而易举的解决了。 首先弄懂i>>SHIFT相当于i/32,i&MASK相当于i%32. 题目中说了 Replace above 2 line 阅读全文

posted @ 2011-05-29 01:36 NULL00 阅读(4492) 评论(4) 推荐(1)

最长公共子序列(LCS)
摘要:对于最长公共子序列(LCS),是典型的动态规划问题,对于这个问题,可以用如下思路来解答。如:X{x1, x2, x3, ... },Y{y1, y2, y3, ...};1.当x1 = y1时,则此时已找到一个相同的值,故接下来只需求{x2, x3, x4, ...}和{y2, y3, y4, ...}的LCS。2.当x1 != y1时,则此时X和Y的LCS是下面两个LCS的最大值: {x2, x3, x4, ...}和{y1, y2, y3, y4, ...}的LCS, 或者{x1, x2, x3, x4, ...}和{y2, y3, y4, ...}的LCS。由上面可以看出这是一个递归问题 阅读全文

posted @ 2011-05-27 21:24 NULL00 阅读(1960) 评论(3) 推荐(1)

关于Ubuntu中google chrome浏览器字体的设置
摘要:我的系统是Ubuntu9.10,在安装google chrome浏览器后,发现其默认字体为楷体,看着很模糊,很不爽。在这里,我的解决方法是: 首先获得root权限,然后进入/opt/google/chrome/locales这个文件夹,在这个文件夹内有一个zh-CN.pak,直接删除之,然后重新启动chrome即可。 如果你担心解决不了的话,建议先将zh-CN.pak备份一下。 阅读全文

posted @ 2011-05-18 23:41 NULL00 阅读(2004) 评论(0) 推荐(0)

删除单链表中偶数节点
摘要:题目意思就是:删除链表中第2个节点,第4个节点......,即删除所有第偶数个节点#include <stdio.h>#include <stdlib.h>#define LEN 8typedef struct node node_t;struct node{ int val; node_t *next; }; //delete even nodevoid delete_even_node(node_t* head);int main(){ node_t** arr = (node_t**)malloc(sizeof(node_t*)*LEN); arr[0] = (n 阅读全文

posted @ 2011-05-13 15:12 NULL00 阅读(5306) 评论(0) 推荐(0)

单链表反转
摘要:void reverse(List* list){ Node* before = list->first; if (before != NULL) { Node* after = before->next; before->next = NULL; while (after) { //交换指针 Node* temp = after->next; after->next = before; before = after; after = temp; } }} 阅读全文

posted @ 2011-05-09 21:43 NULL00 阅读(458) 评论(0) 推荐(0)

非递归实现fibonacci数列
摘要:下面用两个方法实现fibonacci数列,一个是递归的,一个是非递归的,由于递归需要不断的开辟新的栈,并释放开辟的栈,因而更耗时,但是在理解上却容易些。#include <iostream>#include <time.h>using namespace std;int recursive_method(int n);int non_recursive_method(int n);int main(){ clock_t t3 = clock(); printf("%d\n", non_recursive_method(40)); clock_t t4 阅读全文

posted @ 2011-05-09 21:34 NULL00 阅读(2773) 评论(0) 推荐(0)

shell(希尔)排序
摘要:shell(希尔)排序是一种改进的插入排序(链接),如对数组{4, 7, 2, 8, 5, 1, 3, 6},取距离增量为d = 8/2 = 4,形式上将数组分为了4组,4 7 2 85 1 3 6每一列为一组,组内排序后为4 1 2 65 7 3 8,即排序后的数组为{4 1 2 6 5 7 3 8},再取距离增量为d = 4/2 = 2,则可分为2组,每一列为一组4 12 65 73 8,组内排序后为2 13 64 75 8排序后的数组为{2 1 3 6 4 7 5 8},然后采用插入排序即可。下面的shell_sort函数为<<C programming language&g 阅读全文

posted @ 2011-05-08 23:34 NULL00 阅读(308) 评论(0) 推荐(0)

找出输入区间内的回文质数
摘要:假设输入区间为[a, b],a>0,则回文质数满足以下条件:1.为质数(废话)2.必须为回文数(正着看倒着看是一样),但这个回文数的位数必须为奇数位(11除外),为什么呢? 因为位数为偶数的回文数必然是11的倍数,即它不是质数,具体证明如下: 对于数字abcd,abcd = 1000*a + 100*b + 10*c + d = (1100*a - 110*a + 11*a - a) + (110*b - 11*b + b) + (11*c - c) + d = (1100*a - 110*a + 11*a) + (110*b - 11*b) + 11*c + (b + d - a - 阅读全文

posted @ 2011-05-07 21:30 NULL00 阅读(1194) 评论(0) 推荐(0)

算法导论13-1节习题解答
摘要:CLRS 13.1-1利用性质画图,略CLRS13.1-2是否CLRS13.1-3是,因为就根部被改变了,并不与其他性质矛盾。CLRS13.1-44,两个子结点都为红色3,两个子结点一红一黑2,两个子结点都为黑树的叶子的深度将会都一样,因为路径上都是黑结点了。CLRS13.1-5略CLRS13.1-6当路径上一半黑一半红时,为最多,2^(2k) - 1个,当路径上全是黑时,为最少,2^k - 1个。CLRS13.1-7最大比值为1,即根部为黑结点,两个孩子为红,然后就是NIL结点(为黑)。最小比值为0,这时全是黑结点。 阅读全文

posted @ 2011-05-04 17:30 NULL00 阅读(1642) 评论(3) 推荐(0)

KMP算法源码实现
摘要:对于KMP算法的讲解,Matrix67在这里给出了很详细的解释,我在这里只是实现了相关源码而已,以作备用。#include <iostream>using namespace std;const int* get_substring_arr(const char* sequence);void kmp(const char* src, const char* substring, const int* a);int main(){ char* src = "acabaabaabcacaabc"; char* substring = "abaabcac& 阅读全文

posted @ 2011-05-04 14:53 NULL00 阅读(1387) 评论(0) 推荐(0)

导航