递推法:
要求问题规模为N的解,当N=1时,解或为已知,或能非常方便的得到解。当得到问题规模为i-1的解后,由问题的递推性质,能从已经求得的规模为1,2,...,i-1的一系列解,构造出问题规模为i的解。这样,程序可从i=0或i=1出发,重复的,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。
题目:
编写程序,对给定的n(n<=100),计算并输出k的阶乘k!(k=1,2,...,n)的全部有效数字。
思路:
要求的整数超出了范围,用数组来存储。a[0]存储长整数的位数m,例如5! = 120存为{3,0,2,1}。计算k!可采用对已经求得的(k-1)!连续累加k-1次后求出。
程序代码:
#include <stdio.h>
#include <malloc.h>
#define MAXN 1000
// 已知a中的(k - 1)!,求出k!
void pnext(int a[], int k) {
int *b, m = a[0], i, j, r, carry;
b = (int *)malloc(sizeof(int) * (m + 1));
for(i = 1; i <= m; i++) b[i] = a[i];
for(j = 1; j < k; j++) { // 控制累加k-1次
for(carry = 0, i = 1; i <= m; i++) {
// 这里的a[0]保存的是(k-1)!的位数,m则是k!的位数,所以m变化后会大于a[0]
r = (i <= a[0] ? a[i] + b[i] : a[i]) + carry;
a[i] = r % 10; carry = r / 10;
}
if(carry) a[++m] = carry;
}
free(b);
a[0] = m;
}
void write(int *a, int k) {
int i;
printf("%4d!=", k);
for(i = a[0]; i > 0; i--) printf("%d", a[i]);
printf("\n\n");
}
void main() {
int a[MAXN], n, k;
printf("Enter the number n:");
scanf("%d", &n);
a[0] = 1;
a[1] = 1;
write(a, 1);
// 这里就是从1开始的递推过程
for(k = 2; k <= n; k++) {
pnext(a, k);
write(a, k);
getchar();
}
}
分享到:
相关推荐
递推公式的伟大意义——?常见的编程实现方法?(优缺点?)有了公式,人工计算的方法?
程序设计基础徐明星w06-chap06-数据组织一-递推思想-数组定义-字符数组-part1.ppt
递推阶乘
如果把问题的规模缩小,得到的小问题与原问题在结构上性质上相同或相似,并且子问题与原问题关联紧密,子问题的解能够决定原问题的解,这时可以考虑该题可能属于递推问题。 二. 定义子问题:用一个函数把问题准确的...
C语言编写程序利用递推函数实现汉诺塔:把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
在一般的数学统计过程中,为了求得方差,需要预先知道所有的数据项,然后通过求...所以需要通过递推的方式,通过之前状态的均值、方差、计数、以及当前数据项来计算出当前状态的方差。 方差递推公式的计算过程如下:
此程序是用来递归法写的, 可以实现求n的阶乘。
易语言递推阶乘源码,递推阶乘,计算阶乘
N后问题 用递归的方法去求解
设备可靠性的顺序递推法,须自己写入允许决策集合
Levinson快速递推法估计功率谱
易语言源码递推阶乘.rar 易语言源码递推阶乘.rar 易语言源码递推阶乘.rar 易语言源码递推阶乘.rar 易语言源码递推阶乘.rar 易语言源码递推阶乘.rar
。。。
“实用算法(基础算法-递推法)”使你熟练的掌握递推算法
基于BP神经网络递推积分PI-重复控制在微电网APF中的研究.pdf
迭代法、穷举搜索法、递推法、递归、回溯法、贪婪法、分治法、动态规划法
学习常用算法之(4)递推法
由用户输入求和的数列位置N,使用递推法进行求取第N位的Fibonacci数列的值。
基础算法递推法.pdf
易语言源码递推阶乘.7z