法雷数列c语言编程,程序的调试和测试.ppt

本文详细介绍了使用C语言实现法雷数列递归构造的方法,并探讨了如何进行序列的高精度计算。针对给定的序列性质,提出了调整策略,包括在数字和相等和不等的情况下如何递推计算。此外,还强调了调试数据设计的原则,以帮助分析和调试程序。

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

程序的调试和测试

* 法雷数列递归构造代码 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)。对于i>1,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 所有位数的和 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) { i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值