分享几种常用算法的思想
2012-01-10 00:06
246 查看
近段时间,因为放假有比较多的时间,因此趁着这段时间回顾了一下一些常用的算法,以作大家参考,有哪些不正确的地方,希望大家多多指教。
对于程序员来说,学习一门程序语言是非常容易的,但是如何编写一个高质量的程序却是非常困难的。算法可以说是程序的灵魂,一个好的算法往往可以化繁为简、高效率地求解问题。因此,程序员应该重点掌握各种算法思路,并在学习和工作中不断总结算法经验。这个也是我想要回顾这些算法的初衷。
往往在实际的应用中,不同的问题都有不同的解决思路。根据不同的问题,可以采用如下几种常用的算法来进行。
穷举法思想:
① 穷举法
在一个笼子里关着若干鸡和若干个兔子,从上面数共有35个头;从下面数共有94个脚.这样,我们可以使用穷举法来逐个判断是否符合,从而搜索答案.
#include<stdio.h>
intqiongju(int head,int foot,int *chicken,int *rabbit)
{
int re,i,j;
re=0;
for(i=0;i<=head;i++)
{
j=head-1;
if(i*2+j*4==foot)
{
re=1;
*chicken=i;
*rabbit=j;
}
}
return re;
}
voidmain()
{
int chicken,rabbit,head,foot;
int re;
printf("穷举法求解鸡兔同笼问题 :\n");
printf("输入头数:\n");
scanf("%d",&head);
printf("输入脚数 :\n");
scanf("%d",&foot);
re=qiongju(head,foot,&chicken,&rabbit);
if(re==1)
{
printf("鸡有 %d只,兔子有:%d 只。 \n",chicken,rabbit);
}
else
{
printf("无法求解!\n");
}
}
② 递推算法
问题:如果一对两个月大的兔子以后每一月都可以生一对小兔子,而一对新生的兔子出生两个月后才可以生兔子。也就是说,1月份出生,3月份才可产仔。那么假定一年内没有产生兔子死亡事件,那么一年后共有多少对兔子呢?
#include <stdio.h>
int Fibonacci(int n)
{
int t1,t2;
if(n==1||n==2)
{
return 1;
}
else
{
t1=Fibonacci(n-1);
t2=Fibonacci(n-2);
returnt1+t2;
}
}
void main()
{
int n,num;
printf("递推算法求解兔子产仔问题!\n");
printf("请先输入时间 :\n");
scanf("%d",&n);
num=Fibonacci(n);
printf("经过%d 月的时间,共能繁殖%d对兔子!\n",n,num);
}
③ 递归算法求阶乘问题
#include<stdio.h>
#include<stdlib.h>
longfact(int n);
voidmain()
{
int i;
printf("请输入要求阶乘的一个整数 :");
scanf("%d",&i);
printf("%d 的阶乘结果为:%1d\n",i,fact(i));
system("pause");
}
longfact(int n)
{
if(n<=1)
return 1;
else
return n*fact(n-1);
}
④ 分治算法
一个袋子里有30个硬币,其中一枚是假币,并且假币和真币一模一样,肉眼很辩解出来,目前只知道假币比真币重量轻一点。请如何区别假币?
#include<stdio.h>
#include<stdlib.h>
#defineMAXNUM 30
intFalseCoin(int coin[],int low,int high)
{
int i,sum1,sum2,sum3;
int re;
sum1=sum2=sum3=0;
if(low+1==high)
{
if(coin[low]<coin[high])
{
re=low+1;
return re;
}
else
{
re=high+1;
return re;
}
}
if((high-low+1)%2==0)
{
for(i=low;i<=low+(high-low)/2;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2=sum2+coin[i];
}
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/2);
return re;
}
else
{
}
}
else
{
for(i=low;i<=low+(high-low)/2-1;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2=sum2+coin[i];
}
sum3=coin[low+(high-low)/2];
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/2-1);
return re;
}
else
{
}
if(sum1+sum3==sum2+sum3)
{
re=low+(high-low)/2+1;
return re;
}
}
}
voidmain()
{
int n,i,weizhi;
printf("分治算法求解假银币问题 !\n");
printf("请输入银币总的个数:\n");
scanf("%d",&n);
printf("请输入银币的真假 :");
int coin[MAXNUM];
for(i=0;i<n;i++)
{
scanf("%d ",coin[i]);
}
weizhi=FalseCoin(coin,0,n-1);
printf("在上述 %d个银币中,第%d 个银币是假的!\n",n,weizhi);
}
以上几个只是一些思想方法的举例,算法是独立于程序语言的。无论采用何种语言,都可以使用这些算法。
对于程序员来说,学习一门程序语言是非常容易的,但是如何编写一个高质量的程序却是非常困难的。算法可以说是程序的灵魂,一个好的算法往往可以化繁为简、高效率地求解问题。因此,程序员应该重点掌握各种算法思路,并在学习和工作中不断总结算法经验。这个也是我想要回顾这些算法的初衷。
往往在实际的应用中,不同的问题都有不同的解决思路。根据不同的问题,可以采用如下几种常用的算法来进行。
穷举法思想:
① 穷举法
在一个笼子里关着若干鸡和若干个兔子,从上面数共有35个头;从下面数共有94个脚.这样,我们可以使用穷举法来逐个判断是否符合,从而搜索答案.
#include<stdio.h>
intqiongju(int head,int foot,int *chicken,int *rabbit)
{
int re,i,j;
re=0;
for(i=0;i<=head;i++)
{
j=head-1;
if(i*2+j*4==foot)
{
re=1;
*chicken=i;
*rabbit=j;
}
}
return re;
}
voidmain()
{
int chicken,rabbit,head,foot;
int re;
printf("穷举法求解鸡兔同笼问题 :\n");
printf("输入头数:\n");
scanf("%d",&head);
printf("输入脚数 :\n");
scanf("%d",&foot);
re=qiongju(head,foot,&chicken,&rabbit);
if(re==1)
{
printf("鸡有 %d只,兔子有:%d 只。 \n",chicken,rabbit);
}
else
{
printf("无法求解!\n");
}
}
② 递推算法
问题:如果一对两个月大的兔子以后每一月都可以生一对小兔子,而一对新生的兔子出生两个月后才可以生兔子。也就是说,1月份出生,3月份才可产仔。那么假定一年内没有产生兔子死亡事件,那么一年后共有多少对兔子呢?
#include <stdio.h>
int Fibonacci(int n)
{
int t1,t2;
if(n==1||n==2)
{
return 1;
}
else
{
t1=Fibonacci(n-1);
t2=Fibonacci(n-2);
returnt1+t2;
}
}
void main()
{
int n,num;
printf("递推算法求解兔子产仔问题!\n");
printf("请先输入时间 :\n");
scanf("%d",&n);
num=Fibonacci(n);
printf("经过%d 月的时间,共能繁殖%d对兔子!\n",n,num);
}
③ 递归算法求阶乘问题
#include<stdio.h>
#include<stdlib.h>
longfact(int n);
voidmain()
{
int i;
printf("请输入要求阶乘的一个整数 :");
scanf("%d",&i);
printf("%d 的阶乘结果为:%1d\n",i,fact(i));
system("pause");
}
longfact(int n)
{
if(n<=1)
return 1;
else
return n*fact(n-1);
}
④ 分治算法
一个袋子里有30个硬币,其中一枚是假币,并且假币和真币一模一样,肉眼很辩解出来,目前只知道假币比真币重量轻一点。请如何区别假币?
#include<stdio.h>
#include<stdlib.h>
#defineMAXNUM 30
intFalseCoin(int coin[],int low,int high)
{
int i,sum1,sum2,sum3;
int re;
sum1=sum2=sum3=0;
if(low+1==high)
{
if(coin[low]<coin[high])
{
re=low+1;
return re;
}
else
{
re=high+1;
return re;
}
}
if((high-low+1)%2==0)
{
for(i=low;i<=low+(high-low)/2;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2=sum2+coin[i];
}
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/2);
return re;
}
else
{
}
}
else
{
for(i=low;i<=low+(high-low)/2-1;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2=sum2+coin[i];
}
sum3=coin[low+(high-low)/2];
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/2-1);
return re;
}
else
{
}
if(sum1+sum3==sum2+sum3)
{
re=low+(high-low)/2+1;
return re;
}
}
}
voidmain()
{
int n,i,weizhi;
printf("分治算法求解假银币问题 !\n");
printf("请输入银币总的个数:\n");
scanf("%d",&n);
printf("请输入银币的真假 :");
int coin[MAXNUM];
for(i=0;i<n;i++)
{
scanf("%d ",coin[i]);
}
weizhi=FalseCoin(coin,0,n-1);
printf("在上述 %d个银币中,第%d 个银币是假的!\n",n,weizhi);
}
以上几个只是一些思想方法的举例,算法是独立于程序语言的。无论采用何种语言,都可以使用这些算法。
相关文章推荐
- 常用算法思想--递推算法
- 常用编程思想与算法
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 常用几种人脸对齐算法ASM/AAM/CLM/SDM
- Leetcode常用五大算法思想
- 几种简单常用的镜头边缘检测算法(matlab实现)
- 几种常用编程语言的编程思想和方法
- 几种常用的数据结构算法
- spring源码分析,重新认识spring五(内功心法 从思想上说明 spring 常用的几种设计模式,漫谈)
- php几种常用算法
- [转]几种常用分页算法运行效率大比拼
- 常用算法思想--递归算法
- 五大常用算法的思想之一:分治算法
- 分享几种常用的嵌入式Linux GUI及其特点—干货
- 常用算法设计思想之一:动态规划算法
- 发现一种简单高效的Hash算法,比常用的几种算法效率高出一倍以上
- 几种常用的排序算法:插入排序、冒泡排序、选择排序的算法及C++实现
- 常用编程思想与算法
- 几种编程题高难度常用算法总结
- Tonemapping常用的几种算法