利用递推法求最小数生成问题,求阶乘问题
来源:互联网 发布:数据挖掘工具sas 编辑:程序博客网 时间:2024/05/22 14:36
/* 利用递推法求最小数生成问题
例:按递增次序生成1个集合M的最小的n个数.M定义如下:
1、1属于M
2、若x属于M,则2x+1属于M,3x+1属于M
3、无别的数属于M
1为n个数中的第1个数,再右1递推出余下的n-1个数。从两个队列(2x+1,3x+1)选一个“排头”
(两个队列中,尚未选入的第1个小的数)送入数组M中。
*/
#include "stdio.h"
#define M 100
main()
{
int m[M];
int n,p2,p3,i;
m[1]=p2=p3=1; /* 设p2表示2x+1,p3表示3x+1 */
printf("please Input number:");
scanf("%d",&n);
for(i=2;i<=n;i++)
{
if(2*m[p2]==3*m[p3]) /* p2==p3 数组放入任一个,调整p2,p3*/
{
m[i]=2*m[p2]+1;
p2++;
p3++;
}
else if(2*m[p2]<3*m[p3])/* p2<p3 数组放入p2的排头,调整p2*/
{
m[i]=2*m[p2]+1;
p2++;
}
else /* p2>p3 数组放入p3的排头,调整p3*/
{
m[i]=3*m[p3]+1;
p3++;
}
}
/*OUTPUT*/
for(i=1;i<=n;i++)
{
printf("%4d",m[i]);
if(!(i%10)) printf(" ");
}
}
/* 利用递推法求阶乘问题
例:对给定的n(n<=100),计算并输出k的阶乘k!(k=1,2,...,n)的全部有效数字)
如:5!=120;
由于结果可能超过一般整数位数,所以用一个长度为1000的数组来存放结果的各个位数,
数组的第1个元素,存放结果的位数,数组其余部分,依次存放个位,十位,百位...
如:120,位数为3,则数组存放:3021(a[0]=3,a[1]=0,[2]=2,[3]=1)
*/
#include "stdio.h"
#include <malloc.h>
#define MAXN 1000
/*
方法pnext().已知a中的(k-1)!,求k!,只要把a中的结果再加a中原值k-1次(因为a中有一次了),就得k!
如:4!=24,把24再加上4次24就得120,即5!
*/
void pnext(int a[],int k)
{
/* m=a[0]存放整数位数,carry存放进位值*/
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]; /*把a中的结果放b中*/
for(j=1;j<k;j++) /*把a中的结果再(注意是再)加a中原值k-1次*/
{
for(carry=0,i=1;i<=m;i++)/*把a,b对应的每1位(总位数m)相加*/
{
r=(i<=a[0]?a[i]+b[i]:a[i])+carry;
a[i]=r%10; /*得出本位*/
carry=r/10; /*得出进位*/
}
if(carry)
a[++m]=carry; /*进位放a中,同时更新a中数字的总位数m*/
}
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(" ");
}
main()
{
int a[MAXN],n,k;
printf("Enter the number n:");
scanf("%d",&n);
a[0]=1; a[1]=1; /*前两个位已知*/
write(a,1); /*输出1!=1 */
for(k=2;k<=n;k++)
{
pnext(a,k); /*计算k的阶乘*/
write(a,k); /*输出k的阶乘*/
getchar();
}
}
- 利用递推法求最小数生成问题,求阶乘问题
- 21 求阶乘问题
- NY--38 -- 布线问题 [prim算法求最小生成树]
- 求阶乘以及求各项阶乘和问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 最小生成树问题
- 关于求阶乘的c++程序的数的大小范围的问题,请帮帮忙
- 求组合数问题
- 特别大的数的阶乘问题,利用BigInteger进行运算
- Rootkit木马:隐藏技术发展的颠峰
- 清除Trojan-Dropper.Win32.Dropkit.a病毒
- Rootkit For Windows
- 一点想法
- CMMI for DEV v1.2 Chapter 4(3)
- 利用递推法求最小数生成问题,求阶乘问题
- EasyDrag
- linux 下安装jdk
- Jquery编辑数据
- 利用穷举法解决组合问题,背包问题,变量相等问题
- Visual Assist X在中文版VC2003中“Enhance Syntax Coloring”显示不正常的解决方法
- 高级WIN2K ROOTKIT检测技术
- 十月十九日作业
- 高效的数据分页