C语言几个常用算法
- 格式:pdf
- 大小:153.38 KB
- 文档页数:8
C语言常用算法1)。
整数的各位分离void inte(int n){int i;While{i=n%10;i=n/10;}}2)。
求最大最小值例如查找a[]数组中的最小值,n为数组的大小int func(int a[],int n){int min=a[0];for(int i=0;i<n;i++){if (min>a[i]) min=a[i];}return min;}3). 求阶乘long func(int n){int i;long t=1;for(i=2;i<=n;i++)t=t*i;return t;}4).判断某数为素数int prim(int n){int m;for(m=2;m<=sqrt(n);m++) if(n%m==0) return 0; return 1;}5).求最大公约数gcd(int m,int n)int t,r;if(m<n) {t=m;m=n;n=t;}while (n!=0){r=m%n;m=n;n=r;}return m;}6).求最小公倍数,两数之积除以最大公约数gcd(int m,int n)int t,r;if(m<n) {t=m;m=n;n=t;}while (n!=0){r=m%n;m=n;n=r;}return (m*n)/m;}7).数组元素逆置第一个与最后一个交换,倒数第二个与第二个交换exchange (int a[],int n){int i,t;for(i=0;i<n/2;i++){t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;}}8).累加与累乘用c语言实现1+2+3+4+5+6+7+8+9+10的累加方法1:#include <stdio.h>void main( ){int i,sum;sum=0;for(i=1;i<=10;i++){sum=sum+i;}printf(“%d”,sum);}方法2:#include <stdio.h>void main( ){int i,sum;sum=0;i=1; while(i<=10)sum=sum+i;i=i+1;}printf(“%d”,sum);}累乘是把加号变乘号9)。
10个经典的C语言基础算法及代码1.冒泡排序算法冒泡排序是一种简单但效率较低的排序算法,在每一轮遍历中比较相邻的两个元素,如果顺序不正确则交换它们,直到整个数组有序为止。
```cvoid bubbleSort(int arr[], int n)for (int i = 0; i < n-1; i++)for (int j = 0; j < n-1-i; j++)if (arr[j] > arr[j+1])int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}```2.选择排序算法选择排序是一种简单直观的排序算法,它每次从待排序的数组中选择最小(或最大)的元素,并放到已排序的数组末尾。
```cvoid selectionSort(int arr[], int n)for (int i = 0; i < n-1; i++)int min_index = i;for (int j = i+1; j < n; j++)if (arr[j] < arr[min_index])min_index = j;}}int temp = arr[i];arr[i] = arr[min_index];arr[min_index] = temp;}```3.插入排序算法插入排序的基本思想是将数组分为已排序和未排序两部分,每次将未排序的元素插入到已排序的合适位置。
```cvoid insertionSort(int arr[], int n)for (int i = 1; i < n; i++)int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key)arr[j+1] = arr[j];j--;}arr[j+1] = key;}```4.快速排序算法快速排序使用分治法的思想,每次选择一个基准元素,将小于基准的元素放到左边,大于基准的元素放到右边,然后递归地对左右两个子数组进行排序。
C语言常用算法程序汇总C语言是一门广泛应用于计算机编程的语言,具有较高的效率和灵活性。
在C语言中,常见的算法程序包括排序算法、查找算法、递归算法等等。
以下是一些常用的C语言算法程序的汇总:1.排序算法:-冒泡排序:通过多次迭代比较相邻元素并交换位置,将最大的元素逐渐移动到正确的位置。
-插入排序:将待排序的元素与已排序的部分依次比较并插入到正确的位置。
-选择排序:每次从待排序的元素中选择最小的元素并与已排序的部分交换位置。
-快速排序:通过选择一个基准元素,将数组划分为两个子数组进行递归排序。
2.查找算法:-顺序查找:逐个比较数组中的元素,直到找到目标元素或到数组末尾。
-二分查找:通过比较目标元素与数组中间元素的大小,逐步缩小范围,直到找到目标元素。
-哈希查找:通过散列函数将目标元素映射到哈希表的索引位置进行查找。
3.递归算法:-阶乘:通过递归调用自身计算一个正整数的阶乘。
-斐波那契数列:通过递归调用自身计算斐波那契数列的第n个数。
-二叉树遍历:通过递归调用自身遍历二叉树的各个节点。
4.图算法:- 最短路径算法:如Dijkstra算法和Floyd算法,用于计算图中两个节点之间的最短路径。
-拓扑排序:通过对有向无环图进行排序,使得所有的边从排在前面的节点指向排在后面的节点。
- 最小生成树:如Prim算法和Kruskal算法,用于找到图中连接所有节点的最小子树。
5.动态规划:-最长公共子序列:通过寻找两个字符串中的最长公共子序列,解决字符串匹配问题。
-背包问题:通过动态规划解决在给定容量下选取物品使得总价值最大的问题。
-最大子序列和:通过动态规划解决一个数组中选取连续子序列使得和最大的问题。
以上只是一些C语言中常用的算法程序的汇总,实际上,还有很多其他的算法,如逆波兰表达式、霍夫曼编码、最小割等等。
通过学习这些算法,可以更好地理解C语言的应用和开发。
一、字符串处理字符串处理一般使用指针或数组,for或while循环语句。
需要注意给修改后的字符串赋上结尾标志字符‘\0’,可细分为以下几种:1、字符ASC||码值的应用<1> 排序关键是采用合适的排序算法,一般使用易懂的选择排序法。
<2> 比较字符串大小<3> 大小写转换<4> 删除指定ASC||码的字符算法:小写字符=大写字符+322、字符查找及删除指定字符这类题要用if语句,删除字符即把非删除字符拷贝到原串。
3、子字符串查找4、字符统计5、字符串逆置算法是:定义一个临时字符变量把字符串首尾对应位置的字符互换。
6、回文数算法是:通过比较字符串首尾字符是否相等来判断是否是回文数。
7、数字字符串转换成长整型算法是:那数学字符转换成数字;那数字按位合并成一个长整数(即位上的数字乘以位权,并累加求和)8、字符串长度的比较9、子字符串的移动算法是:把字符先拷贝到临时字符串中,然后再拷贝回原串。
10、字符串连接二、数组处理数组与字符串是紧密相连的,如字符串处理也可转换成数组处理。
数组处理多用数组的下标进行运算。
数组处理又可以细分为以下几种:1、数组元素排序2、求数组元素的最大值、最小值和平均值。
求最大值或最小值首先要定义一个临时变量(temp),一般把第一个数组元素的值赋给temp作为比较初值,并在循环中改变temp的值,使temp是当前最小或最大的值。
求平均值要先累加求和,注意必须先给保存和的变量赋初值0。
3、移动数组元素4、把指定数组元素移动到字符串或数组中5、元素分段存放三、数学问题数学问题较多地应用到数组和常见数学算法,注意对于用于累加或累乘的变量要先赋初值。
可细分为以下几种:1、公式求值。
一般应分析公式的特点,把它拆分成几个独立的单元,分别求值,然后组合。
2、多项式求值。
首先分析公式的组成特点,一般后项可以由前项累加或累乘求得,然后再利用循环累加多项式当前所有项的和。
八、常用算法(一)考核知识要点1.交换、累加、累乘、求最大(小)值2.穷举3.排序(冒泡、插入、选择)4.查找(顺序、折半)5.级数计算(递推法)6.一元方程求解(牛顿迭代法、二分法)7.矩阵(转置)8.定积分计算(矩形法、梯形法)9.辗转相除法求最大公约数、判断素数10.数制转换(二)重点、难点精解教材中给出的算法就不再赘述了。
1.基本操作:交换、累加、累乘1)交换交换算法的要领是“借助第三者”(如同交换两个杯子里的饮料,必须借助第三个空杯子)。
例如,交换两个整型变量里的数值:int a=7,b=9,t;t=a; a=b; b=t;(不借助第三者,也能交换两个整型变量里的数值,但不通用,只是一个题目而已。
例如:int a=7,b=9; a=a+b; b=a-b; a=a-b;)2)累加累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。
3)累乘累乘算法的要领是形如“s=s*A”的累乘式,此式必须出现在循环中才能被反复执行,从而实现累乘功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为1。
2.非数值计算常用经典算法1)穷举法也称为“枚举法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。
例如,用穷举法输出“将1元人民币兑换成1分、2分、5分硬币”的所有方法。
main(){int y,e,w;for(y=0;y<=100;y++)for(e=0;e<=50;e++)for(w=0;w<=20;w++)if(1*y+2*e+5*w==100)printf("%d,%d,%d\n",y,e,w);}2)有序序列的插入算法就是将某数据插入到一个有序序列后,该序列仍然有序。
以下给出用数组描述该算法的例子:将x插入一升序数列后,数列仍为升序排列。
C语言常用算法八、常用算法(一)考核知识要点1.交换、累加、累乘、求最大(小)值2.穷举3.排序(冒泡、插入、选择)4.查找(顺序、折半)5.级数计算(递推法)6.一元方程求解(牛顿迭代法、二分法)7.矩阵(转置)8.定积分计算(矩形法、梯形法)9.辗转相除法求最大公约数、判断素数10.数制转换(二)重点、难点精解教材中给出的算法就不再赘述了。
1.基本操作:交换、累加、累乘1)交换交换算法的要领是“借助第三者”(如同交换两个杯子里的饮料,必须借助第三个空杯子)。
例如,交换两个整型变量里的数值:int a=7,b=9,t;t=a; a=b; b=t;(不借助第三者,也能交换两个整型变量里的数值,但不通用,只是一个题目而已。
例如:int a=7,b=9; a=a+b; b=a-b; a=a-b;)2)累加累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。
3)累乘累乘算法的要领是形如“s=s*A”的累乘式,此式必须出现在循环中才能被反复执行,从而实现累乘功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为1。
2.非数值计算常用经典算法1)穷举法也称为“枚举法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。
例如,用穷举法输出“将1元人民币兑换成1分、2分、5分硬币”的所有方法。
main(){int y,e,w;for(y=0;y<=100;y++)for(e=0;e<=50;e++)for(w=0;w<=20;w++)if(1*y+2*e+5*w==100)printf("%d,%d,%d\n",y,e,w);}2)有序序列的插入算法就是将某数据插入到一个有序序列后,该序列仍然有序。
以下给出用数组描述该算法的例子:将x插入一升序数列后,数列仍为升序排列。
C语言常用算法1.整型数据的相关操作运算:十进制位的拆分、合并、左移、右移、位删除、位的累加、连乘等运算;进制数的编程转换、整型数与数字串的相互转换;整型数据的奇偶判断;整型数据间的公约数、公倍数计算,算术、关系、逻辑等运算;●题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
#include<stdio.h>void main(){int num1, num2;int a, b, t;printf("Please input two numbers : ");scanf("%d%d", &num1, &num2);a = num1,b = num2;if(a < b){t = a;a = b;b = t;}for( ;b != 0; ){t = a % b;a = b;b = t;}printf("\nmax common divisor is %d\n", a);printf("min common multiple is %d\n", num1 * num2 / a);}●题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
#include<stdio.h>void main(){int num;int i, j, k;for (num = 100; num < 1000; num++){i = num % 10;j = num % 100 / 10;k = num / 100;if(num == i * i * i + j * j * j + k * k * k){printf("%4d", num);}}printf("\n");}●题目:将一个正整数分解质因数。
C语言常用简单算法C语言是一门功能强大的编程语言,其算法也是很多的。
下面是一些常用的简单算法:1.二分查找算法:二分查找是一种在有序数组中查找特定元素的算法。
它的基本思想是首先在数组的中间位置找到待查找的元素,如果该元素等于目标值,则查找成功;如果该元素大于目标值,说明目标值在数组的前半部分,则在前半部分继续进行查找;如果该元素小于目标值,则说明目标值在数组的后半部分,则在后半部分继续进行查找。
重复以上步骤,直到找到目标值或者确定目标值不存在。
2.冒泡排序算法:冒泡排序是一种简单直观的排序算法。
它的基本思想是通过反复交换相邻的两个元素,将较大的元素逐渐往后移动,从而实现排序的目的。
具体实现时,每一轮比较都会使最大的元素移动到最后。
3.插入排序算法:插入排序是一种简单直观的排序算法。
它的基本思想是将数组分成已排序部分和未排序部分,每次从未排序部分取出一个元素,然后将该元素插入到已排序部分的合适位置,从而实现排序的目的。
4.选择排序算法:选择排序是一种简单直观的排序算法。
它的基本思想是每次选择一个最小(或最大)的元素放到已排序部分的末尾,从而实现排序的目的。
具体实现时,每一轮选择都通过比较找出未排序部分的最小(或最大)元素。
5.快速排序算法:快速排序是一种高效的排序算法。
它的基本思想是通过选取一个基准元素,将数组分成两个子数组,一个子数组中的元素都小于基准元素,另一个子数组中的元素都大于基准元素,然后对这两个子数组分别进行快速排序,最终实现排序的目的。
6.斐波那契数列算法:斐波那契数列是一列数字,其中每个数字都是前两个数字之和。
常见的斐波那契数列算法有递归算法和迭代算法。
递归算法通过反复调用自身来计算斐波那契数列的值,而迭代算法则通过循环来计算。
7.求最大公约数算法:求两个数的最大公约数是一种常见的问题。
常见的求最大公约数的算法有欧几里得算法和辗转相除法。
欧几里得算法通过不断用较小数除以较大数的余数,直到余数为0,得到最大公约数。
常用C语言算法大集合//CRC校验算法unsigned char S[130]; //原始数据为128字节,CRC校验2字节unsigned int CRC ( ) //CRC校验算法(共130字节){unsigned int i,j,m,n,p,q,c=0x1021;m=S[0]*256+S[1]; //首先取两个字节,拼成16位整数,作为基数for (i=1;i<=64;i++) { //其余128字节分64批处理,每批2字节n=S[2*i]*256+S[2*i+1]; //取两个字节,拼成16位整数for (j=0;j<16;j++) { //每批计算16次,每次处理1比特p = m & 0x8000; //保留基数的最高位q = n & 0x8000; //保留当前整数的最高位m <<= 1 ; n <<= 1 ;//两者均左移一位if (q) m++ ; //当前整数的最高位拼入基数的最低位if (p) m ^= c ; //如果基数移出的最高位为1,则“减去”0x1021}}return m; //返回校验结果}main ( ){int i;unsigned int c;for (i=0;i<128;i++) S[i]=i;//设置128字节原始数据S[128]=S[129]=0; //将最后两个字节设置为零c = CRC ( ) ; //进行CRC校验S[128]=c/256;S[129]=c%256;//将校验结果装入最后两个字节c = CRC ( ) ; //再进行CRC校验,结果应该为零S[4] ^= 0x20; //引入一个差错c = CRC ( ) ; //再进行CRC校验,结果不为零,发现差错S[6] ^= 0xff; //再引入8个差错c = CRC ( ) ; //再进行CRC校验,结果不为零,发现差错while (1) ; //在这一行设置断点,中止程序运行,以便观察程序运行的结果}//8比特汉明码模拟通讯程序#define N 8 //原始数据的字节数unsigned char HM[16]={0x00,0x71,0xB2,0xC3,0xD4,0xA5,0x66,0x17,//编码表 0xE8,0x99,0x5A,0x2B,0x3C,0x4D,0x8E,0xFF};unsigned char err[8]={0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//错误图样unsigned char S[N]={0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0};//原始数据unsigned char D[2*N]; //原始数据的汉明码(发送的内容)unsigned char R[N]; //解码结果(接收的内容)void TRANS ( ) //编码程序(模拟发送){unsigned char c1,c2;int i,j;for (i=0,j=0;i<N;i++) { //每字节原始数据编码为两个字节c1=S[i]/16; //c1为原始数据的高4位c2=S[i]%16; //c2为原始数据的低4位D[j++]=HM[c1]; //按编码表对c1进行编码D[j++]=HM[c2]; //按编码表对c2进行编码}}unsigned char parity (unsigned char ch ) //偶校验{int i;unsigned char k=0;for (i=0;i<8;i++) {if ( ch & 0x01 ) k ^= 0x01;ch >>= 1;}return k;}unsigned char UNHM (unsigned char ch) //汉明码解码算法{unsigned char c,p,q0,q1,q2;p = parity (ch) ;//保存全字节偶校验结果q0 = parity (ch&0x4d); //对D1、D3、D5、D7进行偶校验q1 = parity (ch&0x2b); //对D2、D3、D6、D7进行偶校验q2 = parity (ch&0x17); //对D4、D5、D6、D7进行偶校验c = q0 | q1<<1 | q2<<2 ;//拼装校验结果,得到错误图样ch ^= err[c]; //按错误图样进行纠错ch &= 0x0f ; //取出4比特信息内容if ( c && !p ) ch += 0x20 ;//发现两个差错return ch;}//将接收到的两字节信息解码拼装为一字节数据int RECEV ( ) //解码程序(模拟接收){int i,j,k=1; //初始化解码成功标志unsigned char c1,c2;for (i=0,j=0;i<N;i++) {c1= UNHM(D[j++]);//解码一字节if (c1>16) { k=0; c1 &= 0x0f;}//差错判断c2= UNHM(D[j++]);//再解码一字节if (c2>16) { k=0; c2 &= 0x0f;}//差错判断R[i] = c1*16+c2;//拼装为一字节数据}return k; //返回解码是否成功的信息}main ( ){int f; //解码成功标志TRANS ( ) ; //对原始数据进行汉明编码(模拟发送)f = RECEV ( ); //对没有干扰的数据进行解码(模拟接收),f=1,成功.D[5] ^= 0x20 ; //在接收数据中制造一比特差错f = RECEV ( ); //对有干扰的数据进行解码(模拟接收),f=1,成功.D[8] ^= 0x24 ; //在接收数据中制造两比特差错f = RECEV ( ); //对有干扰的数据进行解码(模拟接收),f=0,失败.while (1) ; //在这一行设置断点,中止程序运行,以便观察程序运行的结果}//仪器系数自动标定算法。
C语言经典算法大全老掉牙河内塔费式数列巴斯卡三角形三色棋老鼠走迷官(一)老鼠走迷官(二)骑士走棋盘八个皇后八枚银币生命游戏字串核对双色、三色河内塔背包问题(Knapsack Problem)数、运算蒙地卡罗法求 PIEratosthenes筛选求质数超长整数运算(大数运算)长 PI最大公因数、最小公倍数、因式分解完美数阿姆斯壮数最大访客数中序式转后序式(前序式)后序式的运算关于赌博洗扑克牌(乱数排列)Craps赌博游戏约瑟夫问题(Josephus Problem)集合问题排列组合格雷码(Gray Code)产生可能的集合m元素集合的n个元素子集数字拆解排序得分排行选择、插入、气泡排序Shell 排序法 - 改良的插入排序Shaker 排序法 - 改良的气泡排序Heap 排序法 - 改良的选择排序快速排序法(一)快速排序法(二)快速排序法(三)合并排序法基数排序法搜寻循序搜寻法(使用卫兵)二分搜寻法(搜寻原则的代表)插补搜寻法费氏搜寻法矩阵稀疏矩阵多维矩阵转一维矩阵上三角、下三角、对称矩阵奇数魔方阵4N 魔方阵2(2N+1) 魔方阵1.河内之塔说明河内之塔(Towers of Hanoi)是法国人(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。
解法如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。
如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。