【迭代发算法、递推算法、穷举算法和贪心算法】

C语言常用的算法:
1:迭代法:迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。
1) 平方根公式:
关键算法:x0=n/2,x1+1/2*(x0+a/x0);
代码:
#include<stdio.h>
#include<math.h>
int main()
{
double a,x0,x1;
printf(“请输入a(a>0)的值:\n”);
scanf("%lf",&a);
if(a<0){
printf(“输入有误!\n”);
}else{
x0=a/2.0;
x1=(x0+a/x0)/2.0;
do{
x0=x1;
x1=(x0+a/x0)/2.0;
}while(fabs(x1-x0)>=1e-6);
printf("%f的平方根是:%f\n",a,x1);
}
return 0;
}
2)谷角猜想:
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。
代码如下:
#include<stdio.h>
int main()
{
int cnt=1,a;
printf(“请输入数:\n”);
scanf("%d",&a);
if(a<0){
printf(“请输入正确的数字\n”);
}else{
do{
if(a%2==0){
a=a/2;
printf(“第%d次计算的结果是:%d\n”,cnt,a);
}else{
a=a*3+1;
printf(“第%d次计算的结果是:%d\n”,cnt,a);
}
cnt++;

	}while(a!=1);
} 
return 0;

}
我们可以看出这两段代码都有一个共同特点:变量很少,第一段x0、x1和第二段的a、cnt都被用来反复的计算和赋值,像这种方式,我们常用来处理那种需要反复计算,第一次计算的值对第二次计算还有用的情况,这种方式不仅会减少对变量的需求,减轻代码的负担,而且还更容易理解代码的含义,是很常用和基础的方法。使用这种方式我们所要注意的有两点:确定迭代变量和如何结束循环。

2.递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。
1): 顺推法:从开始走向结果。
2):逆推法:从结果走向开始。

①斐波那契数列:
斐波那契数列又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
规律:第三项开始,每一项为前两项之和。
代码:
#include<stdio.h>
int main()
{
int n,a=1,b=1,c,i,cnt=2;
printf(“请输入想要查看的项数:\n”);
scanf("%d",&n);
if(n1){
printf(“第1项数为:1\n”);
}else if(n
2){
printf(“第1项数为:1\n”);
printf(“第2项数为:1\n”);
}else{
printf(“第1项数为:1\n”);
printf(“第2项数为:1\n”);
for(i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
cnt++;
printf(“第%d项数为:%d\n”,cnt,c);
}
}
return 0;
}

②分西瓜:
分西瓜,一种常见的简单算法题,规则有很多种,比如:
一共有a个西瓜,每一个人分的都是西瓜总数的一半多半个西瓜,假如分了n个人,正好分完,问原先有多少个西瓜?
代码如下:
#include<stdio.h>
int main()
{
double n,i,a=0.0; //a=0,表示最后西瓜正好分完。
printf(“请输入分的人数:”);
scanf("%lf",&n);
for(i=0;i<n;i++){
a=(a+0.5)2.0;
}
printf(“西瓜总数有:%lf”,a);
return 0;
}
③存钱:
某银行整年月息为:0.31%,假设存n元,每年年底取出1000元,a年后刚好取完,问:存了多少元?
代码如下:
#include<stdio.h>
int main()
{
int a,i;
double n=0.0;
printf(“请输入取钱的年数:”);
scanf("%d",&a);
for(i=0;i<a;i++){
n=(n+1000)/(1.0+0.0031
12);
}
printf(“你应该存的钱数为:%.1f”,n);
return 0; }
通过这些简单的代码,我想我们已经简单的了解这种算法的特点,有点类似我们学过的数列,但是我们要注意的是不要把C语言当成了数学题去找它的通项公式,不要把简单的问题复杂化。
3、穷举算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。
“你应该存的钱数为:%.1f”,n);
return 0;
}
通过这些简单的代码,我想我们已经简单的了解这种算法的特点,有点类似我们学过的数列,但是我们要注意的是不要把C语言当成了数学题去找它的通项公式,不要把简单的问题复杂化。
3、穷举算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。
①完全数:如果一个数的除自身外所有的因数的和等于自身的数称为完全数。
代码如下:
#include<stdio.h>
int main()
{
int j,i,a,b,sum=0,cnt=0;
printf(“请判断想要寻找完全数的范围(a,b(a<b)):\n”);
scanf("%d,%d",&a,&b);
printf(“该范围的完全数有:”);
if(a1){
printf("1 "); //因为1具有特殊性,先输出1,方便后面处理。
a=a+1;
}
for(i=a;i<=b;i++){
sum=0; //用于判断完全数,必须保证每次判断是都是以0开始。
for(j=2;j<=i;j++){
//使用j循环,让j充当被除数,寻找i的因数,1很特殊,所以j从2开始。
if(i%j
0){
sum=sum+i/j; //计算因数的和。
}
}
if(sumi){ //如果符合条件,输出为完全数。
printf("%d ",i);
cnt++;
}
if(cnt
9){
printf("\n");
}
}
return 0;
}

②背包问题:
已知:李华帮老奶奶搬蔬菜,蔬菜有"茄子4斤",“白菜2斤”,“西红柿3斤”,“青椒1.6斤”,“黄瓜1.1斤”,“土豆5.2斤”,背包的最大承重量为10斤,求,怎样分配背包一次性背的重量最大?

#include<stdio.h>
int main()
{
int a,b,c,d,e,f,i;
float max=0.0,x;
int bag[6];
charstr[6]={ “茄子4斤”,“白菜2斤”,“西红柿3斤”,“青椒1.6斤”,“黄瓜1.1斤”,“土豆5.2斤”};
for(a=0;a<=1;a++){
for(b=0;b<=1;b++){
for(c=0;c<=1;c++){
for(d=0;d<=1;d++){
for(e=0;e<=1;e++){
x=a
4+b2+c3+d1.6+e1.1+f*5.2;
if(x<=10&&x>max){
max=x;
bag[0]=a;
bag[1]=b;
bag[2]=c;
bag[3]=d;
bag[4]=e;
bag[5]=f;
}
}
}
}
}
}
printf(“背包的总重量为%f\n”,max);
for(i=0;i<6;i++){
if(bag[i]!=0){
puts(str[i]);
}
}
}
4、贪心算法:以最少的代价或脚步,最快得到答案。
①找零钱:买东西时,常常要面临找零的问题,现有100元、50元、20元、10元、5元和1元,若干张,要求使用最少的纸张数完成找零。(假设交易的金额都是整数)
代码如下:
#include<stdio.h>
int main()
{ int a,b,f,g,i,t,s=0;
int c[6]={100,50,20,10,5,1};
int d[6]={0};
printf(“请输入需要支付的金额:”);
scanf("%d",&a);
printf(“请输入支付的金额:”);
scanf("%d",&b);
if(b<a){
printf(“你的钱不够。”);
t=0; //t=0,不需要找零,
} else{
t=1; //t=1,需要
f=b-a; //需要找的零钱
if(f>=100){ //下面几个判断从高到低,最快完成找零
i=100;
g=f/i;
d[0]=g;
f=f%i;
}
if(f>=50){
i=50;
g=f/i;
d[1]=g;
f=f%i;
}
if(f>=20){
i=20;
g=f/i;
d[2]=g;
f=f%i;
}
if(f>=10){
i=10;
g=f/i;
d[3]=g;
f=f%i;
}
if(i>=5){
i=5;
g=f/i;
d[4]=g;
f=f%i;
}
if(f>=1){
i=1;
g=f/i;
d[5]=g;
}
}
if(t==1){
for(i=0;i<6;i++){
printf("%d元 %d张\n",c[i],d[i]);
if(d[i]>0){ //是输出看起来更友好
s=1;
}
}
printf(" 谢谢使用!");
}
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值