![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C_world
文章平均质量分 72
ryan_jianjian
这个作者很懒,什么都没留下…
展开
-
C语言七种关键字
七种关键字,register,static,extern,const,typedef,volatile,inline原创 2016-07-25 19:11:38 · 450 阅读 · 0 评论 -
编程题-实现蛇形输出
实现如下的蛇形输出:1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 具体代码实现:[html] view plain copy #include stdio.h> #include mall原创 2016-12-11 22:29:04 · 826 阅读 · 0 评论 -
Gnome排序(地精排序)
Gnome排序(地精排序),起初由Hamid Sarbazi-Azad 于2000年提出,并被称为stupid排序,后来被Dick Grune描述并命名为“地精排序”,作为一个排序算法,和插入排序类似,除了移动一个元素到最终的位置,是通过交换一系列的元素实现,就像冒泡排序一样。概念上十分简单,不需要嵌套循环。时间复杂度为O(n2),但是如果初始数列基本有序,时间复杂度将降为O(n)。实际上Gnom原创 2016-11-19 23:44:09 · 1073 阅读 · 0 评论 -
快速幂取模算法
所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。我们先从简单的例子入手:求abmodc算法1.直接设计这个算法:int ans = 1;for(int i = 1;i{ ans = ans * a;}ans = an原创 2016-11-20 22:50:06 · 460 阅读 · 0 评论 -
C和C++中struct和typedef struct的分析
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实转载 2016-11-21 23:39:39 · 205 阅读 · 0 评论 -
编程题-最短排序
题目: 对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。 给定一个整数数组A及它的大小n,请返回最短子数组的长度。 测试样例: [1,5,3,4,2,6,7],7 结果:4 思路:在O(n)的时间复杂度中可以完成这道题。当然也有利用快排一次然后比较两个不同的个数来求长度。如果使用快排时间复杂度是O(nlogn)。对于O(n)的解法,举个例子[1,原创 2016-12-12 22:29:55 · 414 阅读 · 0 评论 -
杨辉三角问题
杨辉三角形也叫贾宪三角形,西方叫帕斯卡三角形,其实就是各阶二项式系数排列起来构成的三角形,如下。每行的数字实际上是(a + b) ^ n展开后的结果。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1历史上发现这个三角形的人很多,这里介绍几个主要的,北宋人贾宪约1050年首先使用“贾宪三原创 2016-12-05 23:32:24 · 902 阅读 · 0 评论 -
条件编译
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2转载 2016-11-23 23:11:02 · 381 阅读 · 0 评论 -
机器大小端的检测
// 解释一下就是将 0x11223344 看作字符串 “0x11223344\0”;尾端:44; // 高端就是 “11 22 33 44” 进行存储;(大端) 地址 0 1 2 3 低地址--->高地原创 2016-12-06 23:10:11 · 379 阅读 · 0 评论 -
fork()进阶点
#include int main(int argc, char* argv[]) { fork(); fork() && fork() || fork(); fork(); printf("+/n"); } 答案是总共20个进程,除去main进程,还有19个进程。 我们再来仔细分析一下,为什么是还有19个进程原创 2016-12-13 22:07:26 · 247 阅读 · 0 评论 -
系统调用与库函数
系统调用:是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。一般地,操作系统为了考虑实现的难度和管理的方便,它只提供一少部分的系统调用,这些系统调用一般都是由C和汇编混合编写实现的,其接口用C来定义,而具体的实现则是汇编,这样的好处就是执行效率高,而且,极大的方便了上层调原创 2016-12-07 23:52:36 · 319 阅读 · 0 评论 -
矩阵的乘法算法
一般矩阵乘法算法:原理:矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的栏数(column)和第二个矩阵的列数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为m×n矩阵,B为n×p矩阵,则他们的乘积AB会是一个m×p矩阵。其乘积矩阵的元素如下面式子得出:代码如下:struct mat{ int n, m; doubl原创 2016-11-25 23:47:00 · 7161 阅读 · 0 评论 -
分形几何算法和实现
初识分形1、分形的含义:英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的。其含义是不规则的、破碎的、分数的。曼德勃罗是想用此词来描述自然界中传统欧几里得几何学所不能描述的一大类复杂无规的几何对象。2、分形的几何特征:自相似性:自相似,便是局部与整体的相似。自仿射性:自仿射性是自相似性的一种拓展。如果,将自相转载 2016-12-15 22:22:53 · 16285 阅读 · 0 评论 -
判断一个数是否为2的N次方问题
对于判断一个数是否为2的N次方问题,通常想到的最为直接的办法就是对这个数不断对2取余,为0就将该数变为该数除以2,直到最后该数为1为止。void judge(int n) { while(!(n % 2)) { n = n / 2; if(n == 1) { pri转载 2016-12-21 23:28:21 · 722 阅读 · 0 评论 -
双向冒泡排序
以整数升序排序为例来简单说明一下双向冒泡排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好原创 2016-12-24 23:56:29 · 654 阅读 · 0 评论 -
堆和栈的区别
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据原创 2016-12-18 23:22:18 · 303 阅读 · 0 评论 -
编程-青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?下面我们有数学归纳法分析一下这个问题: 用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1; 当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;原创 2016-12-19 22:39:12 · 829 阅读 · 0 评论 -
希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:· 插入排序在对几乎已经排好序的数据操作时,效率高, 即可以达到线性排序的效率· 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 算法原理原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换。V.原创 2016-11-18 23:35:26 · 343 阅读 · 0 评论 -
c语言练习题
1.进程和线程的区别进程是资源分配的最小单元,具有一定独立功能的程序的一次活动。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。1)简而言之,一个程序至少有一个进程,一个进程至少有一个线程.2) 线程的划分尺度小于进程,使得多线程程序的并发性高。3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运原创 2016-11-30 23:07:07 · 229 阅读 · 0 评论 -
链表找环方法注解
编程判断两个链表是否相交,原题假设两个链表不带环。 问题本身的解答并不是本文的重点。用指针p1、p2分别指向两个链表头,不断后移;最后到达各自表尾时,若p1==p2,那么两个链表必相交 扩展问题1:如果链表可能有环,上面的方法怎么调整?分情况讨论:如果两个链表都没有环,那么同原算法;如果两个链表一个有环,一个没环,那么必然不相交。(*)如果两个链表都有环原创 2016-11-14 22:44:59 · 325 阅读 · 0 评论 -
typedef与#define
typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题. 区别的话,#是宏,处理的时候位于编译前阶段,宏处原创 2016-07-26 15:12:24 · 321 阅读 · 0 评论 -
字符串匹配的KMP算法
举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Ja转载 2016-10-11 22:09:02 · 172 阅读 · 0 评论 -
递归与尾递归
在计算机科学领域中,递归式通过递归函数来实现的。程序调用自身的编程技巧称为递归( recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来原创 2016-11-02 23:33:30 · 1634 阅读 · 1 评论 -
void*解读
void在英文中作为名词的解释为“空虚;空间;空隙”;而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”。void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为我们人提供注释,而是为编译器提供一种所谓的注释。void作用:1.对函数返回的限定,这种情况我们比较常见。2.对函数参数的限定,这种情况也是比较常见的。一般我们常见的就原创 2016-11-03 23:50:06 · 302 阅读 · 0 评论 -
makefile的使用
Make管理器make (make通过makefile来实现操作)1.原因: 当我们写许许多多.c文件的时候,编译起来会非常麻烦。虽然可以gcc *.c,编译所有的.c文件,但是不同目录下的.c文件还是不可以一起编译。所以要用make统一编译。2.特点: 能够自动编译 (1.按照Makefile的内容命令进行编译 2.自动判断时间戳,没有修改源文件就不会再重新编译)3. M原创 2016-10-15 23:15:16 · 288 阅读 · 0 评论 -
malloc/free解读
用于内存管理的malloc/free这对函数,对于使用C语言的程序员应该很熟悉。前段时间听说有的IT公司以“实现一个简单功能的malloc”作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下。毕竟把题目做出来是次要的,了解实现思想、提升技术才是主要的。本文主要是对malloc/free实现思路的介绍,蓝色部分文字是在个人思考中觉得比较核心的东西;另外对于代码的说明,有一些转载 2016-10-17 22:38:57 · 666 阅读 · 0 评论 -
七种排序方法
一、快速排序1. 简单介绍 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少转载 2016-11-08 22:28:20 · 366 阅读 · 0 评论 -
二维数组作函数参数传递
很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错://对于一个2行13列int元素的二维数组//函数f的形参形式f(int daytab[2][13]) {...}//以下两种可以忽略行数f(int daytab[][13]) {...}f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略原创 2016-11-08 22:37:01 · 385 阅读 · 0 评论 -
二分思想和分治法
二分思想和分治法 如果你对概念很敏感,会马上意识到这两者的细微不同:二分搜索每次都要舍弃一半,从留下的一半中寻找目标;而分治法把一个大问题分成两个或多个小问题,递归地求这些小问题的解,最后再把它们小心谨慎的合并起来,并且要仔细考虑合并时产生的新的情况。这当然没有错,但你也马上会从这里意识到两者的巨大联系。就拿选取数组中第k个最小的数的算法来说,有一个版本便是从快速排序中修改而来:划分后,舍弃原创 2016-10-06 22:41:40 · 1756 阅读 · 0 评论 -
void*详解
void在英文中作为名词的解释为“空虚;空间;空隙”;而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”。void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为我们人提供注释,而是为编译器提供一种所谓的注释。void的作用:1.对函数返回的限定,这种情况我们比较常见。2.对函数参数的限定,这种情况也是比较常见的。一般我们常见的就是这两种情原创 2016-10-19 22:53:52 · 369 阅读 · 0 评论 -
C-字节对齐
一、字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存原创 2016-11-10 23:38:46 · 486 阅读 · 0 评论 -
字符串匹配的Boyer-Moore算法
但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法。Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。下面,我根据Moore教授自己的例子来解释这种算法。1.原创 2016-11-28 22:52:04 · 211 阅读 · 0 评论 -
最长重复子序列问题的后缀数组解法
最长重复子序列问题除了使用穷举法,还可以使用后缀数组和后缀树来求解。这里给出使用后缀数组解决的最长重复子序列的过程,并以“banana”为例进行演示。首先写下一个比较两个字符串从头开始共同部分的长度的函数:int comlen(char *p, char *q) { int i = 0; while(*p&&(*p++ == *q++)) i++; re原创 2016-11-01 23:44:39 · 1140 阅读 · 0 评论 -
C语言的宏定义和C++的内联函数有什么意义
宏是预编译器的输入,然后宏展开之后的结果会送去编译器做语法分析。宏与函数等处于不同的级别,操作不同的实体。宏操作的是 token, 可以进行 token的替换和连接等操作,在语法分析之前起作用。而函数是语言中的概念,会在语法树中创建对应的实体,内联只是函数的一个属性。对于问题:有了函数要它们何用?答案是:一:函数并不能完全替代宏,有些宏可以在当前作用域生成一些变量,函数做不到。二:内联函数只是原创 2016-11-29 22:51:54 · 508 阅读 · 0 评论 -
何谓最优解
要定义磁带上第n个文件,须要依次经过前面n-1个文件。假设磁带上有n个文件,长度分别为L[0],L[1], ..., L[n-1]且被访问的概率分别为P[0],P[1],...,P[n-1],请问怎样安排它们在磁带上的存储顺序最好?分析: 最好的安排方式应该对应期望最小的方式。思考一下,不难写出期望的表达式: (注意,访问第i个文件,因为要完整地读入这个文件,经过的长度是L[原创 2016-11-13 23:17:09 · 1030 阅读 · 0 评论 -
字符串匹配-暴力搜索算法
主要特征1、没有预处理阶段2、需要常量额外空间3、通常需要模式串窗口向右移动一个位置4、可以按照任意顺序进行比较5、搜索的时间复杂度为O(mn)6、文本字符期望比较次数:2n算法描述暴力搜索算法由文本串中从0到n-m所有位置的比较组成,无论是否从模式串的起始位置开始,每次匹配过后,模式串向右移动一位。暴力搜索算法没有预处理阶段,文本串和模式串需要常量额外空间,在搜索原创 2016-11-17 23:02:36 · 3501 阅读 · 0 评论 -
多种排序法间的比较
冒泡排序 冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说排序完成。规模比较小的时候应用冒泡排序,主要应用于教学。。。选择排序--只会移动N次 选择排序的主要思想:首先找到数组中最小的那个元素,其次,将它和第一个元素交换。接下来找第二小原创 2016-12-20 23:18:02 · 263 阅读 · 0 评论