- 1、本文档共77页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序的调试和测试
* 法雷数列递归构造代码 int n; void farey(int x1,int y1,int x2, int y2){ if(y1+y2=n){ farey(x1,y1,x1+x2,y1+y2); //生成中间节点前的部分 printf(“%d/%d ”,x1+x2,y1+y2); //输出中间节点 farey(x1+x2,y1+y2,x2,y2); //生成中间节点后的部分 } } int main() { scanf(%d,n); //printf(0/1\n); farey(0,1,1,1); //printf(1/1\n); return 0; } 尹宝林:C语言程序设计进阶 * 序列的第n项 - sequence 序列a(1),a(2),…,a(n)。对于i1,a(i)是满足下面2个性质的最小正整数: (1) a(i) a(i-1); (2) a(i) 的各位数字的和与k×a(i-1)的各位数字的和相等。 给定a1,k,n的值,计算该序列的第n项a(n)的值 输入文件只有一行,包含3个整数 a1,k,n,(0 a1,k,n 300000) 输出一个整数,为序列的第n项a(n)。 例:当输入为1 2 6时,输出 23 尹宝林:C语言程序设计进阶 * 序列的第n项(续) 基本解题思路 从a1开始顺序递推 计算k×a(i-1)的各位和 以a(i-1)为基础,调整各位的值 高精度计算 极限位数 300000^300000 ≈ 101500000 所有位数的和 实际位数 远小于1500000位 尹宝林:C语言程序设计进阶 * 序列的第n项(续) 基本计算功能 高精度计算 数字表示方式的转换 高精度乘法 计算a(i)的各位数字之和s(i) 数字的调整 向数值增加的方向调整 保证调整后的各位数字之和符合要求 在满足上述条件下增量最小 尹宝林:C语言程序设计进阶 * 序列的第n项(续) 关键算法:数字的调整 s(i) s(i - 1) s(i) == s(i - 1) s(i) s(i - 1) 尹宝林:C语言程序设计进阶 * 序列的第n项(续) s(i) s(i - 1)时的调整方法 设s(i) - s(i - 1) = n 从最低位开始逐位向上调整 每位的调整取最大可能值 d = MIN(9 - dig[t], n) 在第i位调整过后修改n的值 n -= d 调整到n == 0 为止 尹宝林:C语言程序设计进阶 * 序列的第n项(续) s(i) = s(i - 1)时的调整方法 基本思路 设s(i - 1) - s(i) = n 从最低位开始每位最多减至零,累积减去n + 1 将被调整的最高位清零,余数移至最低位 在被调整的最高位的上一位加1 例:80 2 2 s(1) == 8, s(2) == 7, n + 1 == 2 80 ? 60 ? 06 ? 106 尹宝林:C语言程序设计进阶 * 序列的第n项(续) s(i) = s(i - 1)时特殊情况的处理 被调整的最高位的上一位为9 一个9或连续的多个9 将这些位清零,将被减去的9累积在余数中 余数从最低位开始分配(贪心方式) 在连续9的上一位加1 例:6999 2 2 s(1) == 33, s(2) == 30, n + 1 == 4 6999 ? 6995 ? 6599 ? 7599 尹宝林:C语言程序设计进阶 * 序列的第n项(续) 调试数据的设计 原则 便于分析和调试:n = 1、2 各种可能的情况: s(i) 、、== s(i - 1) s(i) s(i - 1)时的特例 例: m 1 n、 m k 2 s(i) s(i - 1)时被调整的最高位的上位为9 连续的9 尹宝林:C语言程序设计进阶 * sequence参考代码 int digits[MAX_N], len; int main() { int k, n; char a[BUFSIZ]; … … fscanf(fp_in, %s %d %d, a, k, n); len = set_buf(a, digits); gen_res(k, n, digits); print_res(fp_out, digits); … … } int set_buf(char *a, int *buf) { int i, n; n =strlen(a); for (i = 0; i n; i++) { buf[i] = a[n - i - 1] - 0; } return n; } void print_res(FILE *fp, int *buf) { int i; for (i = len - 1; i =
文档评论(0)