![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 54
notishell
这个作者很懒,什么都没留下…
展开
-
函数调用约定
在VC中,调用方式有__stdcall,__cdecl,__fastcall,thiscall几种。其中前三种是一般调用所能使用的调用方式,thiscall是类对象调用成员函数时使用的调用方式,当在一个函数前使用__declspec(naked)修饰时,编译器不会在函数的内部将不再产生保存和恢复某些寄存器值的代码。__stdcall对于__stdcall调用方式,所有参数通过栈传递,参数压原创 2013-08-08 23:24:05 · 650 阅读 · 0 评论 -
变参函数剖析
变参函数定义形式如func(type a, …),要求至少一个固定参数,因为需要通过这个参数来确定究竟有多少个参数、以及参数的类型。windows中,变参函数用来获取参数的几个宏定义如下。typedef char * va_list;#define _ADDRESSOF(v) (&(v))#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)原创 2013-08-08 23:18:23 · 629 阅读 · 0 评论 -
C风格字符串基本操作
与字符串相关的基本操作包括strlen, strcpy, strcat, strcmp, strchr, strspn, strcspn, strpbrk, strstr, strtok等。在有些平台上,strcpy等使用较多的操作可能直接使用汇编代码编写,本文采用C语言来编写这些函数,然后说说与其相关的一些内容。strlenstrlen这个函数用于计算C风格字符串的长度,而C风格字符串的原创 2013-08-08 22:21:15 · 669 阅读 · 0 评论 -
和为指定值的连续序列
输入一个整数s,打印出所有和为s的连续正整数序列(至少包含两个数)。例如,对于输入15,由于有1+2+3+4+5=15,4+5+6=15,7+8=15,所以打印出1~5、4~6、7~8三个序列。有个比较好的做法是利用等差数列求和公式:s=a*n+n*(n-1)/2。这里的a是第一个元素,n是项数。int solve(int k){ int count = 0; for (原创 2013-08-31 00:06:19 · 1006 阅读 · 0 评论 -
连连看游戏中的最短路径
连连看游戏是一个比较简单的游戏,两个相同的点可以消除,但前提是两点之间的路径不能有多于两个折点。如何去求解两个点之间的距离呢?我们可以将这里的距离定义为二元组(x,y),x表示多少次转折,y表示路径长度。x值越小距离越短,相同x值的情况下y值越小距离越短。这样下面就容易写代码了。#include #include using namespace std;const int N = 20原创 2013-09-04 23:03:02 · 1887 阅读 · 0 评论 -
寻找发帖“水王”
在编程之美中有《寻找发帖“水王”》这么一题,这题书上提供了一个比较好的解法。对于某个元素超过总数N的1/M这类问题有一个通用的方法来解决。试看这样的操作:每次取出M个不同的元素,然后求解余下元素中超过总数1/M的元素。最终将能剩下M-1个元素,超过总数的1/M的元素肯定在其中,计算一下这些元素的数量即可得到解。总的时间复杂度最少能达到O(NMlogM),下面代码实现了这个思路。#include原创 2013-09-05 12:20:56 · 1071 阅读 · 0 评论 -
非递归实现快速排序
非递归实现快速排序的方法和递归类似,其实所有的递归程序都能写成非递归的形式,只要将隐式的栈改成显示的栈即可。void swap(int &in1, int &in2){ int tmp = in1; in1 = in2; in2 = tmp;}int qsort_partition(int A[], int q, int r){ int i, j, k = A[r];原创 2013-09-15 09:37:29 · 1005 阅读 · 0 评论 -
填充Z形二维数组
形如 1 3410 2 5911 6 81215 7131416的数组称谓Z形二维数组。填充这样的数组其实只要按照Z形进行行走填充即可,设置一个flag指示方向,行走的时候检测边界,遇到边界便转换方向。const int N = 16;void fill_z_ar原创 2013-09-16 23:14:39 · 1299 阅读 · 0 评论