“大整数阶乘”问题的递推算法

/*
 标题:<<系统设计师>>应试编程实例-[递推算法程序设计]
 作者:成晓旭
 时间:2002年09月11日(11:52:00-16:26:00)
    实现递推算法的大整数阶乘处理函数
 时间:2002年09月16日(18:38:00-20:02:00)
    实现“斐波那契数列”问题的递推算法函数
*/

//:============================“大整数阶乘”问题的递推算法===========================
#define  MAXN 1000  //最大数据位数
//用递推法求取整数k的阶乖,将结果放入数组array中
void pnext(int array[],int k)
{
 int *temp; //动态数组[临时存储运算大整数]
 int i,j,num_len = array[0],carry,t; //循环变量,长整数位数,进位标志,临时变量
 if(array[0] >= MAXN)
 {
  printf("数据处理位数超过程序设计上限,程序将自动中断运行!\n");
  exit(1);
 }
 temp = (int *)malloc(sizeof(int) * (num_len + 1)); //创建动态数组
 for(i=1;i<=num_len;i++)
  temp[i] = array[i];  //保存原始数据
 for(j=1;j<k;j++)
 {
  for(carry = 0,i=1;i<=num_len;i++)
  {
   if(i <= array[0])
    t = array[i] + temp[i] + carry;
   else
    t = array[i] + carry; //处理最高位
   //数据位调整
   array[i] = t % 10;
   carry = t / 10;
  }
  if(carry)
   array[++num_len] = carry; //在最高位记录进位标志
 }
 free(temp);
 array[0] = num_len;
}
//显示阶乖结果
void Show_Result(int array[],int base_number)
{
 int i;
 printf("%4d!=",base_number);
 for(i=array[0];i>0;i--)
  printf("%d",array[i]);
 printf("\n\n");
}
//计算数据的阶乘
void Count_Result(int array[], int base_number)
{
 int k;
 array[0] = 1;
 array[1] = 1;
 for(k=2;k<=base_number;k++)
 {
  pnext(array,k);
  Show_Result(array,k);
 }
}
//:============================“大整数阶乘”问题的递推算法===========================

时间: 2024-08-03 20:46:07

“大整数阶乘”问题的递推算法的相关文章

算法——递推算法

递推算法 给定一个数的序列H0,H1,-,Hn,-若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系. 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法.  递推算法分为顺推和逆推两种. 相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值.  比如阶乘函数:f(n)=n*f(n-1)  在f(3)

算法--递推策略

递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法.这种算法特点是:一个问题的求解需一系列 的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已 知条件,此种方法叫逆推.无论顺推还是逆推,其关键是要找到递推式.这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重 复处理的特点. 递推算法的首要问题是得到相邻的数据项间的关系(即递推

大整数的排序算法-C++大整数运算 利用已有的大整数怎么实现三个运算

问题描述 C++大整数运算 利用已有的大整数怎么实现三个运算 我有以下的C++代码,请问我该如何实现以下三个运算?如果我在定义大整数的类中定义三个友元函数,能否直接使用我定义的"运算符重载"?a) 求出100以内的数的阶乘:b) 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数.当N=4时,1634满足条件,因为1^4 + 6^4 + 3^4 + 4^4 = 1634(其中"^"表示乘方),求N=21时,所有满足条件的花朵数.

C#基于大整数类的RSA算法实现(公钥加密解密,私钥加密解密)

最近因为项目需要通过RSA加密来保证客户端与服务端的通信安全.但是C#自 带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证 书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实 现是基于网上提供的一个大整数类. 一.密钥管理 取得密钥主要 是通过2种方式 一种是通过RSACryptoServiceProvider取得: /// <summary> /// RSA算法对象,此处主要用于获取密钥对 /// </summary&g

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加.      解题思路:         1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345

大整数取模(秦九韶算法)

//大整数取模,利用秦九韶算法 #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10000 int main() { char str[N]; int len;int i;int mod; long long ans=0; scanf("%s",str); getchar(); scanf("%d",&mod); len=strlen(st

可用于数论计算的无符号大整数类

前些日子,无意中访问到三思科学网,里面介绍了许多数论问题,这也是我儿时的爱好,于是就利用空闲时间编写了一个用于数论计算的无符号大整数类. 一.类的基本结构Class CUSuperInt { public: //构造及析构函数 CUSuperInt(); CUSuperInt(DWORD dwValue); CUSuperInt(char* pszVal); CUSuperInt(CUSuperInt& x); virtual ~CUSuperInt(); protected: DWORD *p

递推求解专题练习

hdoj2044--一只小蜜蜂... Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示.   Input 输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50). Output 对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行. Sample Input 2 1 2 3 6 Sam

【Java编程】Java中的大整数计算

在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的BigInteger可以实现大整数的表示和计算.BigInteger 还提供以下运算:模算术.GCD 计算.质数测试.素数生成.位操作以及一些其他操作. 下面通过程序来看看具体用法: import java.math.BigInteger; public class BigInt { public sta