C语言程序设计(第二版) 教学课件 作者 夏宽理 赵子正编著 第9章 算法设计技术基础.pptVIP

C语言程序设计(第二版) 教学课件 作者 夏宽理 赵子正编著 第9章 算法设计技术基础.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章 算法设计技术基础 9.1 迭代法 9.2 递推法 9.3 回溯法 9.4 贪婪法 9.5 动态规划法 9.1 迭代法 用于求方程近似根的一种常用算法设计方法。 例如:方程为f(x) = 0,用某种数学方法导出等价的形式: x = g(x) 然后按以下步骤执行: (1) 选方程近似根的初值,赋给变量x; (2) 将x的值保存于变量y; (3) 计算g(y),并将计算结果存于变量x; (4) 当x与y差的绝对值还不小于指定的精度要求时,回到步骤(2)继续计算。 9.1 迭代法续 上述算法写成C程序的结构形式有: { x = 方程的初始近似根; do { y = x; x = g(y); /* 按特定的方程计算新的近似根 */ } while (fabs(x - y) = Epsilon); printf(方程的近似根是 %f\n, x); } 【例9.1】求方程 x3 – x – 1 = 0 在x=1.5 附近的一个根 若将方程改写成下列形式: x = 3√(x+1) 并用该式作为迭代算式,下而的程序给出精度达到0.000005条件下的迭代算法的执行过程。程序输出迭代过程中x的值,达到要求算法执行的迭代次数。 【例9.1】程序 #include stdio.h #include math.h typedef double (*fpt)(double); int rootfx(fpt g, double initRoot, double Epsilon, double *root) { double x1, x0 = initRoot; int n = 0; do { printf(x%d = %.5f\n, n, x0); x1 = x0; x0 = (*g)(x1); /* 按指定的公式计算 */ n++; /* 迭代次数增1 */ } while (fabs(x0 - x1) = Epsilon); *root = x0; printf(x%d = %.5f\n, n, x0); return n; } 【例9.1】程序续 double f(double x) { return pow(x+1, 1.0/3.0); } void main() { double x; int m = rootfx(f, 1.5, 0.000005, x); printf(迭代 %d 次,根为 %0.5f\n, m, x); } 9.2 递推法 能采用递推关系构造问题的求解算法,称为递推法。 由问题的递推性质,从已求得的规模为1、2、…、i-1的一系列解,构造出问题规模为i的解。这样,程序可从i = 0 或 i = 1 出发,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。 【例9.2】 对给定的n(n=100),计算并输出k!(k = 1, 2, ……, n)的全部有效数字 k!可能是一个大整数,会超出计算机能直接表示的整数的位数。程序用一维数组存储大整数。 数组的每个元素存储大整数的一位数字,并约定从低位到高位依次从下标为1的元素开始顺序存放。约定下标为0的元素存储大整数的位数。 例如:5!=120,是一个3位数,在数组中的存储形式为:3 0 2 1 【例9.2】分析 计算k!可采用对已求得的(k-1)!乘上k后求出 例如: 已知4!=24,计算5!可用5乘24得到。 (1) 首先是5乘4!的个位数4(20=4×5),得到个位值0和进位2。 (2) 接着是5乘4!的十位数2加上个位相乘的进位( 12=2×5+2),得到十位值2和进位1。 (3) 最后,将进位(可能不止1位)逐位分拆到高位,并修正大整数的位数。 【例9.2】程序 #include stdio.h #define MAXN 1000 void pnext(int a[], int k) /* 已知a[]中的(k-1)!,求k!存于a[] */ { int c = a[0], i, r, carry; for(carry=0, i=1; i=c; i++){ r=k*a[i]+carry; a[i]=r%10; carry=r/10; } while(carry){ /* 将最后的进位逐位分拆存储 */ a[++c]=carry%10; /* 每分拆一位,长整型位数增1 */ carry/=10; }

您可能关注的文档

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档