分享几种常用算法的思想

近段时间,因为放假有比较多的时间,因此趁着这段时间回顾了一下一些常用的算法,以作大家参考,有哪些不正确的地方,希望大家多多指教。

对于程序员来说,学习一门程序语言是非常容易的,但是如何编写一个高质量的程序却是非常困难的。算法可以说是程序的灵魂,一个好的算法往往可以化繁为简、高效率地求解问题。因此,程序员应该重点掌握各种算法思路,并在学习和工作中不断总结算法经验。这个也是我想要回顾这些算法的初衷。

往往在实际的应用中,不同的问题都有不同的解决思路。根据不同的问题,可以采用如下几种常用的算法来进行。

穷举法思想:

① 穷举法

在一个笼子里关着若干鸡和若干个兔子,从上面数共有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);

}

以上几个只是一些思想方法的举例,算法是独立于程序语言的。无论采用何种语言,都可以使用这些算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值