代码改变世界

拆弹实验

2011-11-22 20:20 by justvi, 1732 阅读, 3 推荐, 收藏, 编辑
摘要:近期重读CSAPP,记得第三章后有一实验,二进制炸弹,找出以前下载的目标文件(不记得在哪里下的了,就不贴原链接了),开始了拆弹实验。实验分六个关卡,每个关卡通过一个phase_x函数来判断输入的正确性,因此先查看phase_1的代码,disas phase_1:在<+22>处,判断strings_not_equal的返回值,从字面意义及在<+6><+11>出传入的参数来看,这个函数判断传入的两个参数是否相等,在<+11>的0x8(%ebp)表示phase_1的第一个参数,因此查看0x8049678处的值:x/s 0x8049678可推测第一个关卡 阅读全文

写错二分查找,该死

2011-10-11 23:30 by justvi, 185 阅读, 0 推荐, 收藏, 编辑
摘要:今天笔试,有道写二分查找的题,居然写错了,该死 1 int bs2(int *a, int l, int u, int x) 2 { 3 int m; 4 while (l <= u) 5 { 6 m = (l + u) / 2; 7 if (a[m] > x) 8 u = m - 1; 9 else if (a[m] < x)10 l = m + 1;11 else12 return m;13 }14 return -1;15 }16 17 ... 阅读全文

堆排序学习

2011-10-08 23:29 by justvi, 331 阅读, 0 推荐, 收藏, 编辑
摘要:堆,数据结构表示为一个数组对象,可以被看做是一颗完全二叉树,下标为0的是树根,顺序下来依次是上一层结点的左右儿子。则可以定义操作parent,left,及right,分别返回当前数组元素的父、左儿子、右儿子下标。1 #define PARENT(i) (((i) + 1) / 2 + 1)2 #define LEFT(i) ((i) * 2 + 1)3 #define RIGHT(i) (((i) + 1) * 2)保持(最大)堆的性质:假定当前结点的左右子树都满足了(最大)堆的性质,但此时此结点的值小于其中的一个或两个,则违反了(最大)堆的性质,需要进行调整,首先找到父、左儿子、右儿子... 阅读全文

算法100题25

2011-10-06 19:04 by justvi, 386 阅读, 0 推荐, 收藏, 编辑
摘要:/* 题目来自:http://blog.csdn.net/v_JULY_v* 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)* 功能:* 在字符串中找出连续最长的数字串,并把这个串的长度返回,* 并把这个最长数字串付给其中一个函数参数outputstr所指内存。* 例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,* outputstr所指的值为123456789*/int continuemax(char *outputstr, char *in 阅读全文

请用if-else if

2011-10-04 13:59 by justvi, 280 阅读, 0 推荐, 收藏, 编辑
摘要:话说在写归并排序的时候,碰到了问题,因为gdb用得不太熟练,折腾了半天,才搞明白为什么出了问题。且看以下代码: 1 void merge(int *a, int l, int m, int u) 2 { 3 int lstart = l; 4 int lend = m; 5 int rstart = m + 1; 6 int rend = u; 7 int n = u - l + 1; 8 int *temp = (int *)malloc(sizeof(int) * n); 9 int i;10 for (i = 0; lsta... 阅读全文

算法100题26

2011-09-19 00:16 by justvi, 845 阅读, 0 推荐, 收藏, 编辑
摘要:/* 题目来自:http://blog.csdn.net/v_JULY_v* 题26:定义字符串的左旋转操作:把字符串前面若干个字符移动到字符串的尾部。* 如abcdef左旋转2位得到cdefab。* 方法:(可见《编程珠玑》) AB->BA: f(f(A)f(B)) = BA,f表示将字符串逆置* (补充)说明:将AB转换成BA,可将A逆置得到Ar,再将B逆置得到Br,再将整体ArBr逆置得到BA。* 如abcdef左旋2位,首先将ab逆置得到ba,再将cdef逆置得到fedc,再将整体bafedc逆置得到cdefab。*/ 1 #include <stdio.h> 2 3 阅读全文

算法100题27

2011-09-18 23:48 by justvi, 147 阅读, 0 推荐, 收藏, 编辑
摘要:/* 题目来自:http://blog.csdn.net/v_JULY_v* 题27:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。* 求总共有多少种跳法。* 方法:设最后一次跳的次数为f(n),则跳到n可以通过两种方法进行,一是在n-1级跳一级到第n级,一是在第n-2级跳两级到第n级* 所以总的方法f(n)=f(n-1)+f(n-2),递归可得解。* 此法会重复计算f(i)的值,所以转化为迭代,通过中间值保存计算的结果简化复杂度(可见sicp)*/ 1 #include <stdio.h> 2 3 int f(int n) 4 { 5 if (n == 1) 6 ... 阅读全文

算法100题51

2011-09-18 23:23 by justvi, 168 阅读, 0 推荐, 收藏, 编辑
摘要:/* 题目来自:http://blog.csdn.net/v_JULY_v* 题51:输入一个正数n,输出所有和为n连续正数序列。* 例如输入15,输出三个连续序列1-5,4-6和7-8* 方法:首先可以判断这样的序列一定出现在序列1...n的前半部分,可以通过两次循环求和,看和是否与n相等来确定序列的开头和结尾。* 有无更好方法?*/ 1 #include <stdio.h> 2 3 void func(int n) 4 { 5 int i, j, result; 6 for (i = 1; i <= n / 2; i++) 7 { 8 result... 阅读全文

算法100题54

2011-09-18 23:01 by justvi, 932 阅读, 0 推荐, 收藏, 编辑
摘要:/* 题目来自:http://blog.csdn.net/v_JULY_v* 题目54:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数数组位于数组的后半部分。* 可以借助快速排序中分成两个部分的思想:取数组中的一个数,移动元素使得数组前半部分的数小于基准数,后半部分大于基准数。* 用i标示当前元素,j标示最后一个为奇数的下标,若i处数为奇数,则与j+1处的数更换位置,更新i,j即可。*/ 1 #include <stdio.h> 2 3 void swap(int *a, int i, int j) 4 { 5 int temp; 6 tem... 阅读全文

算法100题14

2011-09-16 19:51 by justvi, 247 阅读, 0 推荐, 收藏, 编辑
摘要:/* 题目来自:http://blog.csdn.net/v_JULY_v* 题目14:输入一个已经按升序排列过的数组和一个数字,在数组中找出两个数,使的它们的和正好等于这个数字* 如1,2,4,7,11,15和数字15,则可以输出4和11* 方法:(可见《编程之美》) 初始化i,j分别指向数组开头和结尾,因为数组升序排列,则若arr[i]+arr[j]大于输入数,则可以确定此刻的arr[j]必不满足条件,因为它与最小的数字相加* 都大于输入数,则可以缩小范围(j--),同理可以处理i直至满足条件。*/ 1 #include <stdio.h> 2 3 void find(int 阅读全文