算法设计与分析100例子(C语言版)

本文通过具体实例介绍了几种常见的算法设计方法,包括循环算法、递归算法和迭代算法。通过分解数字、解决兔子繁殖问题及求最大公约数等问题,详细阐述了每种算法的设计思路与实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环与递归

【例】任给十进制的正整数,请从高位到低位逐位输出各位数字。

循环算法设计

本题目中要求“从高位到低位”逐位输出各位数字,但由于我们并不知道正整数的位数,算法还是“从低位到高位”逐位求出各位数字比较方便。这样就不能边计算边输出,而需要用数组保存计算的结果,最后倒着输出。

# include <stdio.h> 
main( )                      
{
	int  n,j,i=0,a[16];
	printf("请输入一个大于10的整数:\n");
	scanf("%d",&n); 
	while(n>=10){ 
	   	a[i]=n % 10;
        i=i+1;
		n=n/10;
	}
    a[i]=n;
	for(j=i;j>=0;j=j-1)
  		printf("%d",a[j]);
}

递归算法设计

递归的关键在于找出递归方程式和递归终止条件

与f2不同,递归算法是先递归地求n\10的个位数字,然后再求个位数字n的个位数字并输出。这样输出操作是在回溯时完成的。递归停止条件与f2相同为n<10。

# include <stdio.h> 
int f(int n)                      
{
	if(n<10)
    	printf("%d",n);
    else{ 
		f(n/10);
        printf("%d", n%10); 
	}
}

main()                      
{
	int n;
	printf("请输入一个大于10的整数:\n");
	scanf("%d",&n); 
	f(n); 
}

迭代算法

迭代法(Iteration)也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法一般用于数值计算。迭代法应该是我们早已熟悉的算法策略,程序设计语言课程中所学的累加、累乘都是迭代算法策略的基础应用。

利用迭代算法策略求解问题,设计工作主要有三步:

1)确定迭代模型

2)建立迭代关系式

3)对迭代过程进行控制

【例1】兔子繁殖问题

问题描述:一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少只兔子。

问题分析:因一对兔子从出生后第三个月开始每月生一对小兔子,则每月新下小兔子的对儿数(用斜体数字表示)显然由前两个月的小兔子的对儿数决定。则繁殖过程如下:

​ 一月 二月 三月 四月 五月 六月 ……

​ 1 1 1+1=2 2+1=3 3+2=5 5+3=8 ……

#include <stdio.h>

int main( )
{ 
	int i,a=1,b=1,m[10];
  	//printf("%d%d",a,b);
 	for(i=1;i<=10;i++)
  	{ 
	  	m[i] = a + b;
    	a=b;
    	b=m[i];
   }
   for(i=1;i<=10;i++)
		printf("%d ",m[i]);
}

编译结果
在这里插入图片描述

【例2】求两个整数的最大公约数。

数学建模:辗转相除法是根据递推策略设计的。
不妨设两个整数a>b且a除以b商x余c;则a-bx=c,不难看出a、b的最大公约数也是c的约数(一个数能整除等式左边就一定能整除等式的右边),则a、b的最大公约数与b、c的最大公约数相同。同样方法推出b、c的最大公约数与……,直到余数为0时,除数即为所求的最大公约数。
算法设计:循环“不变式”第一次是求a、b相除的余数c,第二次还是求“a”“b” 相除的余数,经a=b,b=c操作,就实现了第二次还是求“a”“b” 相除的余数,这就找到了循环不变式。循环在余数c为0时结束。
例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147:
1071 = 2 × 462 + 147.
然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21:
462 = 3 × 147 + 21.
再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数:
147 = 7 × 21 + 0.
此时,余数是0,所以1071和462的最大公约数是21

#include <stdio.h>

main()
{ 
	int a, b,c,d;
  	//input(a,b);
  	printf("请输入两个整数:\n");
  	scanf("%d%d",&a,&b);
   
	c = a % b;
    while(c != 0)
    { 
		a=b;
        b=c;
        c=a % b;
	}
		//printf("最大公约数为:%d", b);
	d = b;
printf("最大公约数为:%d", d);
}

编译结果
在这里插入图片描述

蛮力法

分而治之法

贪婪算法

动态规划

回溯法

分支界限法

图算法

算法设计分析》目录: 第一篇引入篇 第1章算法概述1.1用计算机求解问题算法 1.1.1用计算机求解问题的步骤 1.1.2算法及其要素和特性 1.1.3算法设计及基本方法 1.1.4从算法到实现 1.2算法描述 1.2.1算法描述简介 1.2.2算法描述约定 1.2.3一个简单问题的求解过程 1.3现代常用算法概览* 1.3.1压缩算法 1.3.2加密算法 1.3.3人工智能算法 1.3.4并行算法 1.3.5其他实用算法 第2章算法分析基础 2.1算法分析体系及计量 2.1.1算法分析的评价体系 2.1.2算法的时间复杂性 2.1.3算法的空间复杂性 2.1.4NP完全性问题 2.2算法分析实例 2.2.1非递归算法分析 2.2.2递归算法分析 2.2.3提高算法质量 第二篇基础篇 第3章算法基本工具和优化技巧3.1循环递归 3.1.1循环设计要点 3.1.2递归设计要点 3.1.3循环递归的比较 3.2算法数据结构 3.2.1原始信息处理结果的对应存储 3.2.2数组使信息有序化 3.2.3数组记录状态信息 3.2.4大整数存储及运算 3.2.5构造趣味矩阵 3.3优化算法的基本技巧 3.3.1算术运算的妙用 3.3.2标志量的妙用 3.3.3信息数字化 3.4优化算法的数学模型 3.4.1杨辉三角形的应用 3.4.2最大公约数的应用 3.4.3公倍数的应用 3.4.4斐波那契数列的应用 3.4.5递推关系求解方程 习题 第三篇核心篇 第4章基本的算法策略4.1迭代算法 4.1.1递推法 4.1.2倒推法 4.1.3迭代法解方程 4.2蛮力法 4.2.1枚举法 4.2.2其他范例 4.3分治算法 4.3.1分治算法框架 4.3.2二分法 4.3.3二分法变异 4.3.4其他分治方法 4.4贪婪算法 4.4.1可绝对贪婪问题 4.4.2相对或近似贪婪问题 4.4.3贪婪策略算法设计框架 4.5动态规划 4.5.1认识动态规划 4.5.2动态规划算法设计框架 4.5.3突出阶段性的动态规划应用 4.5.4突出递推的动态规划应用 4.6算法策略间的比较 4.6.1不同算法策略特点小结 4.6.2算法策略间的关联 4.6.3算法策略侧重的问题类型 习题 第5章图的搜索算法 5.1图搜索概述 5.1.1图及其术语 5.1.2图搜索及其术语 5.2广度优先搜索 5.2.1算法框架 5.2.2广度优先搜索的应用 5.3深度优先搜索 5.3.1算法框架 5.3.2深度优先搜索的应用 5.4回溯法 5.4.1认识回溯法 5.4.2回溯法算法框架 5.4.3应用1——基本的回溯搜索 5.4.4应用2——排列及排列树的回溯搜索 5.4.5应用3——最优化问题的回溯搜索 5.5分支限界法 5.5.1分支搜索算法 5.5.2分支限界搜索算法 5.5.3算法框架 5.6 图的搜索算法小结 习题 第四篇应用篇 第6章算法设计实践6.1循环赛日程表 6.2求3个数的最小公倍数 6.3猴子选大王 6.4最大子段和问题 6.5背包问题 6.5.1利润无关的背包问题 6.5.2利润有关的背包问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Performer_Cherry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值