![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
程序设计与算法
文章平均质量分 55
_NJZY_
这个作者很懒,什么都没留下…
展开
-
平方根倒数速算法
#include #include #include #define MAGIC_NUMBER 0x5F3759DF/* 平方根倒数速算法 */static float inv_sqrt(float x) { float x_half = 0.5f * x; //long i = *(long *)&x; /* get bits for floating valu转载 2016-02-27 15:03:16 · 1029 阅读 · 0 评论 -
数组循环左移的一种方法
/** * 数组循环左移的一种方法 * 时间复杂度O(n),空间复杂度O(1) */#include #include typedef int element;element a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int gcd(int a, int b) { if (b == 0) return a;原创 2015-08-30 13:44:45 · 2956 阅读 · 0 评论 -
秦九韶算法和欧几里得算法演示
#include int a[100];int qinjiushaoAlg(int * a, int n, int x){ int ans = a[n], i; for (i = n - 1; i >= 0; i--) ans = ans * x + a[i]; return ans;}int main(){ int n, x, i原创 2015-03-21 16:19:54 · 850 阅读 · 0 评论 -
循环冗余检验(CRC)求帧检验序列(FCS)
#include #include /** * 循环冗余检验(CRC),求帧检验序列(FCS) * 参数:M是待传送的数据 * p是除数 * 返回:帧检验序列(FCS) * 说明:都是从0开始编号。 */uint32_t getFCS(uint32_t M, uint32_t p) { uint32_t tmp; uint8_t plen =原创 2015-04-14 15:07:57 · 8865 阅读 · 0 评论 -
位运算复习——字节的奇偶校验和反转一个字节中的二进制位
#include #include /** * 用软件实现字节的奇偶校验 * 返回值:如果这个字节中含有奇数个1,则返回1; * 否则返回0 */uint8_t parityCheck(uint8_t val) { uint8_t cnt = 0; while (val) { if (val & 0x01)原创 2015-04-15 12:39:46 · 1412 阅读 · 0 评论 -
关于C语言中省略函数的返回类型的测试
/** * 关于C语言的函数省略返回类型的测试。 * 实验结果表明,函数省略返回类型时, * 默认的返回类型为int */#include //函数省略了返回类型test0() { return 123; //一个较小的整数}test1() { return 4.765f; //浮点数}test2() { return 12345原创 2015-04-08 21:35:23 · 2141 阅读 · 0 评论 -
可变参数列表的宏和<stdarg.h>实现函数的可变参数列表
标准头文件中的printf()函数很诡异,它有一个可变的参数列表。下面是自己实现的printf()函数。#include /* printf, vprintf*/#include /* va_list, va_start, va_copy, va_arg, va_end */#include void myprintf(const char * format,原创 2015-04-07 13:39:54 · 504 阅读 · 0 评论 -
enum类型的变量定义为一个字节存储
#include //给枚举类型限定字节数,只能在C++11模式下运行typedef enum weekday: unsigned char { SUN, MON, TUE, WED, THU, FRI, SAT} weekday_t;int main() { weekday_t weekday = MON; printf("%d\n", sizeof (week原创 2015-03-22 22:01:52 · 3408 阅读 · 0 评论 -
将16位无符号整数转化为BCD码存放在数组中
#include #include #include uint8_t arry[3];/** * 将16位无符号整数转化为BCD码, * 每个BCD码占用半字节,一共占用三个字节。 */void uint16_tToBCD(uint8_t * arry, uint16_t num) { uint8_t index = 0, tmp; memset(arry, 0原创 2015-04-10 12:47:58 · 4396 阅读 · 0 评论 -
将一个字节存储的2位BCD码解码
#include #include /* 将一个字节存储的2位BCD码解码成普通的二进制数 */uint8_t decode(uint8_t BCD) { uint8_t geWei, shiWei; geWei = BCD & 0x0F; shiWei = BCD >> 4; return shiWei * 10 + geWei;}int main(原创 2015-03-24 22:53:10 · 2013 阅读 · 0 评论 -
经典冒泡排序
#include #include uint8_t a[] = { 5, 4, 3, 2, 1 };void bubbleSort(uint8_t * a, uint8_t len) { int8_t i, j; //!!!使用无符号类型的循环变量自减会溢出! uint8_t tmp, flag; for (i = 0; i <= len - 2;原创 2015-03-24 22:08:33 · 364 阅读 · 0 评论 -
二叉排序树(二叉搜索树,BST)的使用
/** * 输入一系列整数,建立二叉排序树, * 并进行前序、中序、后序遍历。 * 不计入重复元素。 * 方法:注意二级指针的使用, * 相当于引用一级指针, * 被调函数能改变调用函数的变量。 */#include #include #include typedef struct treeNode { int dat; struct treeNode *原创 2015-09-07 20:49:37 · 383 阅读 · 0 评论 -
命令行和文件的操作
/** * 使用命令行方式 * 复制任意多个文件内容到一个文件中 * 命令行形式:mycopy 1.txt 2.txt 3.txt 4.txt * 功能: 复制2.txt 3.txt 4.txt的内容到1.txt中 */#include #include #include #define BUF_SZ 81char buf[BUF_SZ];void main(int a原创 2015-09-06 14:27:11 · 412 阅读 · 0 评论 -
插入排序样例
#include int a[100];/* 插入排序 */void insertSort(int * a, int n) { int tmp, i, j; for (i = 1; i < n; i++) { tmp = a[i]; for (j = i-1; j >= 0 && a[j] > tmp; j--) a[原创 2015-09-06 13:13:01 · 311 阅读 · 0 评论 -
C语言 文件操作
#include #include #include #include int a[100];int a2[100];void main() { FILE * fp1; FILE * fp2; FILE * fp3; int num, i; int index = 0; float fnum = 1.0f / 7.0f, fnum2原创 2014-12-03 23:11:21 · 355 阅读 · 0 评论 -
关于数组指针和函数指针的测试
/* * 关于数组指针和函数指针的测试 * -ansi -pedantic -errors */#include #include #define ARR_SZ 0x10void init_arr(int * const a, int cnt) { int i; for (i = 0; i < cnt; i++) a[i] = i;}voi原创 2016-01-12 21:04:25 · 396 阅读 · 0 评论 -
三维数组的存储映射
#include #include const int HGT = 10;const int ROW = 11;const int COL = 12;int a[HGT][ROW][COL];//重载指针的运算int getValue(int i, int j, int k) { return *((int *)a + i*ROW*COL + j*COL + k);}原创 2015-02-23 10:32:07 · 1550 阅读 · 0 评论 -
C语言 类型提升
/* 编译选项:-ansi -pedantic */#include int main(void) { char var0 = 0, var1 = 1; short var2 = 2, var3 = 3; printf("sizeof(char) == %d, sizeof(char + char) == %d\n", sizeof(var原创 2016-01-09 18:18:29 · 565 阅读 · 0 评论 -
C89标准库头文件——非本地跳转<setjmp.h>的应用
setjmp函数用于设置跳转的目的位置,longjmp函数进行跳转。env:保留了需要返回的位置的堆栈情况。setjmp的返回值:直接调用该函数,则返回0;若由longjmp的调用,导致setjmp被调用,则返回val(longjmp的第二个参数)。/* * -ansi -pedantic -errors * -O */#include #include jmp_buf原创 2016-01-08 15:08:23 · 820 阅读 · 0 评论 -
关于浮点数转换为整数的测试
#include int main(void) { float flt = 1.116533e24f; printf("%e\n", flt); printf("%ld\n", (long)flt); /* wrong */ printf("%u\n", *(unsigned long * const)&flt); /* 将浮点数理解为整数 */原创 2016-01-13 22:04:10 · 1436 阅读 · 0 评论 -
C语言中函数的参数列表为空和void的区别
C语言中函数的参数列表为空和void的区别C标准和C++标准在main函数上是有区别的,所以我分别详细来介绍他们。对于C语言: C89标准的main()函数是可接受的,尽管现在建议是使用C99的标准。C99标准只定义了如下两种可接受的函数原型:int main(void)int main(int argc, char *argv[]) 以上函数原型微小的变形也是可以被接转载 2015-12-31 19:55:12 · 12942 阅读 · 0 评论 -
C语言的printf函数的执行顺序
C语言的printf函数是先从右往左计算各表达式的值(入栈),再从左往右输出各表达式的值(出栈)。#include int main() { int i = 1; printf("%d %d %d\n", i++, i++, i++); printf("%d\n", i); return 0;}/** * 输出结果: * 3 2 1 * 4原创 2015-12-12 15:20:05 · 2820 阅读 · 0 评论 -
数据结构之快速排序
#include #include #include int a[1000];int partition(int * a, int low, int high) { int pivotKey; pivotKey = a[low]; //将枢轴记录取出来,此位置就空出来了 while (low < high) { while (low = piv原创 2015-09-18 11:20:46 · 357 阅读 · 0 评论 -
大整数加法回顾
/* hdu 1002 AC */#include #include #include char res[1001], num1[1001], num2[1001];void bigIntAdd(char * res, char * num1, char * num2) { char * tmp; int tmp2; char sum, jinwei;原创 2015-09-14 15:59:28 · 421 阅读 · 0 评论 -
关于有符号数的一些测试
#include #include #define opposite(x) (~(x) + 1)#define lowBit(x) ((x) & -(x))/* 有符号数溢出的测试 */void test0() { int8_t n = 0; do { printf("%hhd\n", n);//[0,127]->[-128,-1] n+原创 2015-03-31 13:05:51 · 437 阅读 · 0 评论 -
#define与const的存储差别
#define A 3 与 const uint8_t A = 3;哪个更好呢?const 定义的只读变量从汇编角度来看 只是给出了对应的内存地址 而不是像define一样给出的是立即数 所以 const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量 存放在静态区) 而define定义的宏变量在内存中有若干个拷贝 define宏是在预编译阶段进行替换 而const修转载 2015-03-18 12:59:59 · 1118 阅读 · 0 评论 -
计算十进制整数的子段组成的整数
#include #include const uint32_t powdec[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};uint32_t subNum(uint32_t number, uint8_t least, uint8_t most原创 2015-03-22 22:34:52 · 426 阅读 · 0 评论 -
事件序列问题 贪心法
/* 事件序列问题 */#include #include #include #include #include using namespace std;typedef struct event { int no, bgn, en;} event_t;bool cmp(const event_t e1, const event_t e2) { return e原创 2015-02-28 12:32:37 · 1372 阅读 · 0 评论 -
八数码问题
#include #include #include typedef int state_t[9];const int dx[] = {-1, 1, 0, 0};const int dy[] = {0, 0, -1, 1};const int MAX_STATE = 1000000;const int HASH_SIZE = 1000003;state_t st[MAX_STA原创 2015-02-27 23:52:15 · 449 阅读 · 0 评论 -
循环链表 猴子选大王
/* 循环链表 猴子选大王*/#include #include typedef struct monkey { int num; struct monkey * next;} monkey_t;//head指向第一个节点,tail指向最后一个节点monkey_t *head = NULL, *tail = NULL;void create(in转载 2015-02-27 18:05:00 · 6650 阅读 · 0 评论 -
最短路径问题
#include #include #define _min(a, b) ((a) < (b) ? (a) : (b))const int h[4][3] = {{3, 2, 3}, {2, 1, 4}, {3, 4, 5}, {3, 1, 2}};const int v[3][4] = {{2, 2, 3, 4}, {4, 1, 2, 4}, {1, 2, 2, 3}};int p[原创 2015-02-12 20:34:12 · 296 阅读 · 0 评论 -
分书问题
#include const int like[5][5] = { {0, 0, 1, 1, 0}, {1, 1, 0, 0, 1}, {0, 1, 1, 0, 1}, {0, 0, 0, 1, 0}, {0, 1, 0, 0, 1}};int take[5], book[5] = {0, 0, 0, 0, 0};void _try(int i)原创 2015-02-11 21:51:26 · 1080 阅读 · 0 评论 -
计算组合数
#include #include int C[101][101];void init() { memset(C, 0, sizeof (C));}int Cmn(int m, int n) { if (m - n < n) { return Cmn(m, m - n); } if (n == 0 || n == m) {原创 2015-02-11 11:16:17 · 454 阅读 · 0 评论 -
数字旋转方阵
#include const int N = 9;int P[N][N];void _fill(int number, int bgn, int sz) { int i = 0, h = bgn, v = bgn; if (sz == 0) return; else if (sz == 1) { P[bgn][bgn] = num原创 2015-02-11 11:42:20 · 2997 阅读 · 0 评论 -
C语言 有符号数和无符号数的移位运算
对于无符号数来说,左移和右移都是用的逻辑移位,即左移低位空出的补0,右移高位空出的补0;对于有符号数来说,用的是算术移位,左移多出的会移进符号位,右移在gcc编译器下是算术右移,即空出的高位补符号位。例:int16_t n = 0x4000; //此时符号位为0n int16_t num = 0x8000; //此时符号位为1num >>= 1; //此时n为0xC原创 2015-02-23 18:35:22 · 16010 阅读 · 0 评论 -
逻辑右移和算术右移
汇编语言中的逻辑右移(SHR)是将各位依次右移指定位数,然后在左侧补0,算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐。比如,在汇编语言中,对于算术右移,如果最高位为1,则补1,否则补0, 如将10000000算术右移7位,应该变成11111111,而逻辑右移7位,则不考虑符号位,变为00000001,这点就是算术右移和逻辑右移的区别。在汇编中,可以用算术右移来进行有转载 2015-02-23 18:16:50 · 7877 阅读 · 2 评论 -
下楼问题
#include int take[99];int num = 0;void _try(int i, int s) { int j, k; for (j = 3; j > 0; j--) { if (i >= j) { take[s] = j; if (i == j) { n原创 2015-02-11 12:02:55 · 565 阅读 · 0 评论 -
经典Hanoi问题
#include int step = 1;void _move(int m, int p, int q, int r);int main() { int n; puts("Please input the number of dish."); scanf("%d", &n); printf("The step of moving %d dishies原创 2015-02-09 21:27:16 · 391 阅读 · 0 评论 -
任务11.2(动态规划)
长度为7的数字串:3215125,现要求插入三个乘号,使乘积最大。#include #include const int S = 3215125;int p[7][7][3];int d[7][7];void init() { int sl = 1000000, i, j; memset(p, 0, sizeof (p)); memset(d, 0, siz原创 2015-02-13 20:21:34 · 466 阅读 · 0 评论 -
计算程序的运行时间
#include #include int main() { int i = (int)1e7; while (i--); printf("time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC); return 0;}原创 2015-02-13 22:12:03 · 339 阅读 · 0 评论