算法程序
- 格式:doc
- 大小:66.50 KB
- 文档页数:10
算法与程序的区别
算法就是计算或者解决问题的步骤。
可以想象成⾷谱,要做出特定的料理,就需要遵循上⾯的⾷谱步骤。
同样,如果想⽤计算机解决特定问题,就需要遵循算法。
特定的问题很多,⽐如“将随意排列的数字按从⼩到⼤的排序重新排列”、“寻找出发点到⽬的地的最短路径”等等。
⾷谱和算法的最⼤区别就是算法是严密的。
⾷谱上经常会出现描述得⽐较模糊的部分,⽽算法是⽤数学形式来描述的,所以⼗分明确。
算法和程序有相似的,区别在于程序是以计算机能够理解的编程语⾔编写⽽成的,可以在计算机上运⾏,⽽算法是以⼈类能够理解的⽅法描述的,⽤于编写程序之前。
不过在这个过程中到哪⾥为⽌是算法,从哪⾥开始是程序,并没有明确的界限。
就算使⽤同⼀个算法、编程语⾔不同,写出来的程序也不同;即便使⽤相同的编程语⾔,写程序的⼈不同,写出来的程序也不同。
C语言常用算法程序汇总C语言是一门广泛应用于计算机编程的语言,具有较高的效率和灵活性。
在C语言中,常见的算法程序包括排序算法、查找算法、递归算法等等。
以下是一些常用的C语言算法程序的汇总:1.排序算法:-冒泡排序:通过多次迭代比较相邻元素并交换位置,将最大的元素逐渐移动到正确的位置。
-插入排序:将待排序的元素与已排序的部分依次比较并插入到正确的位置。
-选择排序:每次从待排序的元素中选择最小的元素并与已排序的部分交换位置。
-快速排序:通过选择一个基准元素,将数组划分为两个子数组进行递归排序。
2.查找算法:-顺序查找:逐个比较数组中的元素,直到找到目标元素或到数组末尾。
-二分查找:通过比较目标元素与数组中间元素的大小,逐步缩小范围,直到找到目标元素。
-哈希查找:通过散列函数将目标元素映射到哈希表的索引位置进行查找。
3.递归算法:-阶乘:通过递归调用自身计算一个正整数的阶乘。
-斐波那契数列:通过递归调用自身计算斐波那契数列的第n个数。
-二叉树遍历:通过递归调用自身遍历二叉树的各个节点。
4.图算法:- 最短路径算法:如Dijkstra算法和Floyd算法,用于计算图中两个节点之间的最短路径。
-拓扑排序:通过对有向无环图进行排序,使得所有的边从排在前面的节点指向排在后面的节点。
- 最小生成树:如Prim算法和Kruskal算法,用于找到图中连接所有节点的最小子树。
5.动态规划:-最长公共子序列:通过寻找两个字符串中的最长公共子序列,解决字符串匹配问题。
-背包问题:通过动态规划解决在给定容量下选取物品使得总价值最大的问题。
-最大子序列和:通过动态规划解决一个数组中选取连续子序列使得和最大的问题。
以上只是一些C语言中常用的算法程序的汇总,实际上,还有很多其他的算法,如逆波兰表达式、霍夫曼编码、最小割等等。
通过学习这些算法,可以更好地理解C语言的应用和开发。
C程序设计的常用算法算法(Algorithm):计算机解题的基本思想方法和步骤。
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、简单数值类算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
1、求阶乘:n!=1*2*384…..*n; n!= n*(n-1)!=下列程序用于求n的阶乘.在累乘之前,一定要将用于存放乘积的变量的值初始化为1.long func(int n){int i;long t=1;for(i=2;i<=n;i++)t*=i;return t;}printf("\n");}main(){ int n;scanf("%d", &n);printf("n!=%ld\n", fac(n));}2、整数拆分问题:把一个整数各个位上的数字存到数组中#define N 4 /* N代表整数位数*/viod split(int n, int a[ ])/* 1478: a[ 3]=8, a[2 ]=7, a[1 ]=4…*/{int i;for(i=N-1;i!=0; i--){ a[i]=n%10;n=n/10;}}main(){int i,m=1478,b[N-1];split(m, b);for(i=0;i<4; i++)printf(“%5d”, b[i]);}3、求整数的因子之和12=1*2*3*4 long factor(int n){int i;long sum=0;for(i=1;i<=n;i++)if(n%i= =0)sum+=i;return sum;}注意:因子包括1和自身。
什么是算法、程序、程序设计技术和软件算法、程序、程序设计技术和软件⒈算法算法是一系列解决问题的清晰指令,可以按照特定的顺序执行。
它们是解决复杂问题的基础,通常由一系列步骤组成,每个步骤都有明确的输入和输出。
算法可以用来解决各种问题,如排序、搜索、路径规划等。
⑴算法的特点- 清晰明确:算法应该以一种明确的方式描述问题的解决步骤,使其他人能够理解和实现。
- 输入输出:算法应该明确指定输入和输出的数据和格式,以确保正确性和一致性。
- 有限性:算法应该在有限的步骤之后终止,而不是无限循环。
- 确定性:在给定相同输入时,算法应该始终产生相同的输出。
- 可行性:算法应该能够在合理的时间内执行。
⑵常见的算法类型- 排序算法:将一组数据按照特定的顺序进行排列,如冒泡排序、快速排序、归并排序等。
- 搜索算法:在给定一组数据中查找特定值的位置,如线性搜索、二分搜索、哈希搜索等。
- 图算法:解决图论中的问题,如最短路径、最小树、拓扑排序等。
- 动态规划:将复杂问题分解成较小的子问题进行求解,然后将结果组合成最终的解。
- 递归算法:通过调用自身来解决问题,如斐波那契数列、汉诺塔等。
⒉程序程序是一组按照特定语法和结构编写的指令,用于执行特定的任务或操作。
它由一系列的语句组成,可以被计算机理解和执行。
程序通常用来实现算法,将解决问题的步骤转换为可以计算机理解的指令。
⑴程序语言程序语言是一种用于编写程序的形式化语言。
它定义了一组规则和语法,以指定程序的结构和行为。
常见的程序语言包括C、C++、Java、Python等。
每种程序语言都有其特定的语法和语义,可以用来实现不同类型的算法和解决各种问题。
⑵程序执行过程程序的执行过程包括以下步骤:- 编译:将程序源代码翻译成可执行的机器代码,可执行文件。
- 运行:在计算机上执行可执行文件,按照程序指令执行特定的任务。
- 调试:检测和修复程序中的错误和问题,以确保程序的正确性和稳定性。
⒊程序设计技术程序设计技术是一种用于设计和实现程序的方法和原则。
算法和程序关系
算法和程序是计算机科学中两个非常重要的概念。
算法是一种解决问题的方法,而程序则是实现算法的具体实现。
算法和程序之间有着密不可分的关系,没有算法就没有程序,没有程序就没有算法的实现。
算法是一种抽象的概念,它是一种解决问题的方法,可以用自然语言、流程图、伪代码等形式来描述。
算法是计算机科学中最基本的概念之一,它是计算机程序设计的基础。
算法的好坏直接影响程序的效率和质量。
程序是算法的具体实现,它是一组指令的集合,用来告诉计算机如何执行某个任务。
程序可以用各种编程语言来编写,如C、C++、Java、Python等。
程序的好坏取决于算法的好坏和编程人员的水平。
算法和程序之间的关系非常密切。
算法是程序的灵魂,程序是算法的具体实现。
一个好的算法可以让程序更加高效、简洁、易于维护和扩展。
而一个差的算法则会导致程序效率低下、代码冗长、难以维护和扩展。
在实际编程中,程序员需要根据具体的问题选择合适的算法,并将其转化为程序。
程序员需要对算法进行分析和优化,以提高程序的效率和质量。
同时,程序员还需要不断学习新的算法和技术,以应对不断变化的需求和挑战。
算法和程序是计算机科学中两个非常重要的概念,它们之间密不可分。
一个好的算法可以让程序更加高效、简洁、易于维护和扩展,而一个差的算法则会导致程序效率低下、代码冗长、难以维护和扩展。
因此,程序员需要不断学习和掌握新的算法和技术,以提高程序的效率和质量。
排序问题P11#include<iostream>using namespace std;inline void swap(int &a,int&b){int temp=a;a=b;b=temp;}void perm(int list[],int k,int m){if(k==m){for(int i=0;i<=m;i++) cout<<list[i];cout<<endl;}elsefor(int i=k;i<=m;i++){swap(list[k],list[i]);perm(list,k+1,m);swap(list[k],list[i]);}}void main(){int a[10],n;cout<<"请输入要排列的数的个数:";cin>>n;for(int i=0;i<n;i++)cin>>a[i];perm(a,0,n-1);}二分搜索P16#include<iostream.h>int n,i,j; int a[1000];void xuanzhe(){int i, j, min, t;for (i=0; i<n-1; i++){min = i;for (j=i+1; j<n; j++){if (a[j] < a[min]){min = j;}}if (min != i){t = a[i];a[i] = a[min];a[min] = t;}}}int BinarySearch(int x){int left=0;int right=n-1;while(left<=right){int middle=(left+right)/2;if (x==a[middle]) return middle;if (x>a[middle]) left=middle+1;else right=middle-1;}return -1;}void main(){cout<<"输入数字的个数:"<<endl;cin>>n;for(i=0;i<n;i++)cin>>a[i];xuanzhe();cout<<"请输入要查找的数:";cin>>j;int m=BinarySearch(j);if(m==-1)cout<<"没有你要找的数"<<endl;elsecout<<"你要找的数在数组中的第"<<m+1<<"个"<<endl; }棋盘覆盖P13(应用,运行的的结果的图会画,标数字)#include<iostream.h>int tile=1;int board[100][100];void chessBoard(int tr,int tc,int dr,int dc,int size){if(size==1)return;int t=tile++;int s=size/2;if(dr<tr+s && dc<tc+s)chessBoard(tr, tc, dr, dc, s);else{board[tr+s-1][tc+s-1]=t;chessBoard(tr, tc, tr+s-1, tc+s-1, s);}if(dr<tr+s && dc>=tc+s)chessBoard(tr, tc+s, dr, dc, s);else{board[tr+s-1][tc+s]=t;chessBoard(tr, tc+s, tr+s-1, tc+s, s);}if(dr>=tr+s && dc<tc+s)chessBoard(tr+s, tc, dr, dc, s);else{board[tr+s][tc+s-1]=t;chessBoard(tr+s, tc, tr+s, tc+s-1, s);}if(dr>=tr+s && dc>=tc+s)chessBoard(tr+s, tc+s, dr, dc, s);else{board[tr+s][tc+s]=t;chessBoard(tr+s, tc+s, tr+s, tc+s, s);}}void main(){int size;cout<<"输入棋盘的size(大小必须是2的n次幂): "; cin>>size;int index_x,index_y;cout<<"输入特殊方格位置的坐标: ";cin>>index_x>>index_y;chessBoard(0,0,index_x,index_y,size);for(int i=0;i<size;i++){for(int j=0;j<size;j++)cout<<board[i][j]<<"\t";cout<<endl;}}石子合并问题P90#include <iostream>using namespace std;int Fx[200][200],Fn[200][200],Arr[200];int i,j,k,Temp,Maxm,Minm,N;int main(){while(cin>> N){for(i=1;i<=N;i++){cin>> Temp;Arr[i]=Arr[i-1]+Temp;Arr[i+N]=Temp;}for(i=N+1;i<=2*N;i++)Arr[i]=Arr[i-1]+Arr[i];for(k=1;k<=N-1;k++)for(i=1;i<=2*N-k;i++){Maxm=0;Minm=765432100;for(j=i+1;j<=i+k;j++){Temp=Arr[i+k]-Arr[i-1]+Fx[i][j-1]+Fx[j][i+k]; if (Temp > Maxm)Maxm=Temp;Temp=Arr[i+k]-Arr[i-1]+Fn[i][j-1]+Fn[j][i+k]; if(Temp<Minm)Minm=Temp;}Fx[i][i+k]=Maxm;Fn[i][i+k]=Minm;}Maxm=0;Minm=765432100;for(i=1;i<=N;i++){if (Fx[i][i+N-1] > Maxm) Maxm=Fx[i][i+N-1];if (Fn[i][i+N-1] < Minm) Minm=Fn[i][i+N-1];}cout<< Minm <<endl;cout<< Maxm <<endl;}return 0;}数字三角形P90#include<iostream>using namespace std;int main (){int n,i,j,k;int a[102][102]={0};int c[102]={0};int d[102]={0};int max;cin>>n;for (i=1;i<=n;i++)for (j=1;j<=i;j++)cin>>a[i][j];for (i=1;i<=n;i++) {for (k=1;k<=i;k++){d[k]=c[k-1]>c[k]?c[k-1]:c[k]; d[k]+=a[i][k];}for(j=1;j<k;j++){c[j]=d[j];}}max=0;for(i=1;i<=n;i++){if(c[i]>max) max=c[i];}cout<<max;return 0;}租用游艇P91#include<iostream>using namespace std;#define N 201int f[N][N];int n;void init(){int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++) f[i][j]=0;cout<<"请输入每两站之间的租金:"<<endl;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++) cin>>f[i][j];}void dyna(){for(int k=2;k<n;k++)for(int i=0;i<n-k;i++){int j=i+k;for(int p=i+1;p<j;p++){int temp=f[i][p]+f[p][j];if(f[i][j]>temp) f[i][j]=temp;}}}int main(){cout<<"请输入游艇站的个数:";cin>>n;init();dyna();cout<<f[0][n-1]<<endl;return 0;}数量极差P133#include<iostream>using namespace std;long int a[5000]={0},b[5000]={0};void quicksort(int low,int high){int mid=a[(low+high)/2],i=low,j=high,t;while(i<=j){while(a[i]<mid)i++;while(a[j]>mid)j--;if(i<=j){t=a[i];a[i]=a[j];a[j]=t;i++;j--;}}if(low<j)quicksort(low,j);if(high>i)quicksort(i,high);}int main(){long int i,j,n,maxx=0,minn=0;cout<<"请输入正整数个数:";cin>>n;for(i=1;i<=n;i++) cin>>a[i];quicksort(1,n);for(i=1;i<=n;i++)b[i]=a[i];i=2;while(i<=n){maxx=a[i-1]*a[i]+1;if(i==n)break;j=i;while(a[j+1]<maxx&&j+1<=n){a[j]=a[j+1];j++;}a[j]=maxx;i++;}i=n-1;while(i>=1){minn=b[i+1]*b[i]+1;if(i==1)break;j=i;while(b[j-1]>minn&&j-1>=1)j--;b[j]=minn;i--;}cout<<"数列极差是:"<<maxx-minn<<endl;return 0;}N后问题#include<iostream>using namespace std;#include<iostream>using namespace std;class Queen{friend int nQueen(int);private:bool Place(int k);void Backtract(int t);int n,*x;long sum;};bool Queen::Place(int k){for(int j=1;j<k;j++)if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))return false;return true;}void Queen::Backtract(int t){if (t>n){sum++;cout<<"第"<<sum<<"种方法:";for(int i=1;i<=n;i++)cout<<x[i]<<" ";cout<<endl;}else{for(int i=1;i<=n;i++){x[t]=i;if(Place(t)) Backtract(t+1);}}}int nQueen(int n){Queen X;X.n=n;X.sum=0;int *p=new int[n+1];for(int i=0;i<=n;i++)p[i]=0;X.x=p;X.Backtract(1);delete []p;return X.sum;}void main(){int n,m;cout<<"请输入皇后个数:";cin>>n;m=nQueen(n);cout<<endl;cout<<"有"<<m<<"种可行方法"<<endl; }图的m着色问题P163#include<iostream>using namespace std;const int N=10;int a[N][N];class Color{friend int mColoring(int ,int );private:bool OK(int k);void Backtrack(int k);int n,m,*x;long sum;};bool Color::OK(int k){for(int j=1;j<=n;j++)if((a[k][j]==1) && x[j]==x[k])return false;return true;}void Color::Backtrack(int t){if(t>n){sum++;for(int i=1;i<=n;i++)cout<<x[i]<<'\t';cout<<endl;}elsefor(int j=1;j<=m;j++){x[t]=j;if(OK(t)) Backtrack(t+1);x[t]=0;}}int mColoring(int n,int m){Color X;X.n=n;X.m=m;X.sum=0;int *p=new int [n+1];for(int i=0;i<=n;i++)p[i]=0;X.x=p;X.Backtrack(1);delete [] p;return X.sum;}int main(){int n,m,t;int i,j;cout<<"输入图中顶点的个数"<<endl;cin>>n;cout<<"输入颜色的种数:"<<endl;cin>>m;cout<<"输入图的邻接矩阵"<<endl;for(i=1;i<=n;i++)for(j=1;j<=n;j++)cin>>a[i][j];cout<<endl;t=mColoring(n,m);if(t)cout<<"可行方案个数:"<<t<<endl;elsecout<<"这个图不是m="<<m<<"可着色的"<<endl; return 0;}。