c语言求大数阶乘

c语言求大数阶乘
c语言求大数阶乘

大数的阶乘

#include

void main()

{

int a,b;

int i,j,k,n,carry,count;

unsigned long int result[500]={0};

do

{ a=0;

result[0]=1;

printf("qing shu ru yi ge zheng shu\n");

scanf("%d",&n);

if (n<0)

{

printf("qing chong xin shu ru yi ge zheng shu\n"); continue;}

else if(n==0)

{printf("%d!=%d\n",n,1);}

else

{

for(i=2;i<=n;++i)

{

for(j=0;j<=a;++j)

result[j]*=i;

for(k=0;k<=a;++k)

{

carry=result[k]/100000;

result[k]%=100000;

result[k+1]+=carry;

}

if(result[a+1]>0)

++a;

}

if(result[a]>=10000)

b=5;

else if(result[a]>=1000)

b=4;

else if(result[a]>=100)

b=3;

else if(result[a]>=10)

b=2;

else b=1;

printf("\n%d!=\n",n);

printf("%5d",result[a]);

result[a]=0;

count=1;

for(i=a-1;i>=0;--i )

{

printf("%05d",result[i]);

result[i]=0;

if(++count%10==0)

printf("\n");

}

if(a>=1)

printf("\ngong you %d wei\n",b+a*5) ;

else

printf("\ngong you %d wei\n",b);

printf("\n");

}

}

while(n!=0);

}

写了这么长的东西,把自己都绕迷了。高手几句话就概括了,每句浓缩的都是精华,这就是差距:

#include

int main(void)

{

long a[9000]={1,0},i,c,len,pos=1;

int n;

printf("请输入你要计算阶乘的数:\n");

scanf("%d",&n);

pos=n;

for ( len=1;n>1; n--)

{

for (c=0,i=0; i

{

a[i]=(c+=a[i]*n)%10000;

c/=10000;

}

((a[i]=c)>0)?len++:0;

}

printf("\n\n%d的阶乘:\n",pos);

for( len--,printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]);

printf("\n");

return 0;

}

阶乘运算

//阶乘各算法的 C++ 类实现 #include #include #include #include using namespace std; class Factorial { static const int MAXN = 5001; // 最大阶乘数,实际用不到这么大int *data[MAXN]; // 存放各个数的阶乘 int *nonzero; // 从低位数起第一个非0数字 int maxn; // 存放最大已经计算好的n的阶乘int SmallFact(int n); // n <= 12的递归程序 void TransToStr(int n, int *s); // 将数n倒序存入数组中 void Multply (int* A, int* B, int* C, int totallen); // 执行两个高精度数的乘法public: Factorial(); ~Factorial(); void Calculate(int n); // 调用计算阶乘 int FirstNonZero(int n); // 返回阶乘末尾第一个非0数字int CountZeros(int n); // 返回阶乘末尾有多少个0 int SecondNum(int n); // 返回阶乘左边的第二个数字 bool CanDivide(int m, int n); // 判断数值 m 是否可以整除 n! void Output(int n) const; }; int Factorial::SmallFact(int n) { if (n == 1 || n == 0) return 1; return SmallFact(n-1)*n; } void Factorial::TransToStr(int n, int *tmp) { int i = 1; while (n) { tmp[i++] = n%10; n /= 10; } tmp[0] = i-1; } void Factorial::Multply (int* A, int* B, int* C, int totallen) { int i, j, len; memset(C, 0, totallen*sizeof(int));

过万n的阶乘的代码

#include #include struct Factorial { int digit; struct Factorial *next; }; void Input(int &n) { cout << "Please the n: "; cin>> n; cout < next; int count=0; if(first-> next!=NULL)//如果链表节点个数大于1,则把链表逆置{ while(q!=NULL) { p-> next=q-> next; q-> next=first; first=q; q=p-> next; } } cout <sid pst所指向的结构体变量中的sid这个成员

C++与python的大数阶乘

如何用C++和python解决大数阶乘问题 1000!是个很大的数,C++中没有能储存这么多位数精确数的数据类型,那么如何解决这个问题呢?可以用字符数组来解决,把每次相乘的结果作为字符数组储存,再分别对每一个字符进行处理,大于等于10的进行进位。由于字符数组可以有很大的长度,因此可以计算出1000!的精确值。 实际操作中为了方便,把每次相乘的结果到过来存,例如:4!=[4,2,0,0 0 C++程序如下: #include using namespace std; #define N 1000 static int a[N*3]; int main() { int i,j; int len=1; //每次得到的阶乘的长度 int tem,carry; //临时变量,进位 int count=0; //最终结果中1的个数 a[1]=1; for(i=2;i<=N;i++) { carry=0; for(j=1;j<=len;j++) { tem=a[j]*i+carry; a[j]=tem; carry=tem/10; if(j==len&&carry!=0) { len++; } }

} for(i=len;i>=1;i--) { cout<

数据结构大数相乘

课题名称:大数相乘 1.问题描述 计算机的内存有限,而且各个函数类型的范围有限,如果要计算两个更大的乘数,就会超出范围,得到不精确的数,如何得到更精确的数,而又不受计算机内存空间的限制,本程序就可以解决大数相乘的问题。 2.设计思路 这个程序的关键是如何保存大数的各个数字,以及如何处理大数乘法的进位问题。本人是运用栈的思想做的,先定义一个整型的栈,大数传入栈的整型数组中,在乘法运算函数中,先从一个栈中取出一个大数S1的个位上的数字a,再从另一个大数S2取出一个个位数字b, 再将a*b+d(d为进位数)的个位数字压到栈S中,十位上进位的数字先保存到d中,再从S2中取出一个十位数,与a相乘,得到的个位数字再压到栈S中,再从S2中取出一个数字,以此类推,直到S2 中的数字被a乘完,得到一个新的大数S,将该栈保存到A栈中,将S销毁,再从S1中取出大数的十位数字,与S2的各个数字相乘,得到一个新的大数压到S中,将S保存到B中,将B移位处理后,然后与A相加得到另一个大数,以此类推,最终可相加得到想要的结果。这其中还用到了大数相加的原理。

3.数据结构设计 前面提到,要用到栈的操作,这里,由于一个大数的最大长度是一定的,且大数最多执行的操作是插入和删除操作,所以顺序存储结构可以带来更大益处。为了便于大数相加,将大数的各个数字存入到整型数组中。 #define MAXSIZE 100 typedef struct node { int data[MAXSIZE]; int top; }SeqStack,*PSeqStack; 4.功能函数设计 (1)栈初始化函数Init_SeqStack(char *ch) 此函数是将传入的字符处理成0~9的整数存入整型数组中。将*ch-’0’转化为整数存入S->data[i]中,结束标志是*ch不等于’\0’ (2)首尾倒置函数Convert_SeqStack(PSeqStack A) 此函数是将栈中的数值首尾颠倒,比如以前是1234,现在变成4321。只要将传入的A的栈中的元素依次取出压到C中,再返回C栈即可(3)大数相加函数Add(PSeqStack S1,PSeqStack S2) 此函数是处理两个大数相加的功能。将传入的两个大数压到S1和S2中,当S1或S2不为空时,从S1中取出a,从S2中取出b,得到Result=(a+b)%10+d,其中初始时d=0,再判断Result是否大于10,如

大数乘法

大数乘法 (一)介绍: 还是模拟的方法,用数组c[] 记录a[] 和b[]的乘积。之后在把c[] 中 的每一位变成个位数就ok 了! (二)代码如下: #include #include using namespace std; char a[100],b[100]; int len_a,len_b; int c[200]; void mul(char a[],char b[],int c[],int l_a,int l_b) { int i,j; for(i=l_a-1;i>=0;i--) { for(j=l_b-1;j>=0;j--) c[i+j+2]+=(a[i]-'0')*(b[j]-'0');//这个操作比较好,保证了相乘之后相加形 //成了错位,易于进行c[]每一位的相加操作} for(i=l_a+l_b;i>0;i--) { c[i-1]+=c[i]/10; c[i]%=10; } bool flag= true; i=0; while(c[i]==0) i++; for(;i<=len_a+len_b;i++) { flag=false; cout<

int main() { cin>>a>>b; len_a=strlen(a),len_b=strlen(b); memset(c,0,sizeof(c)); mul(a,b,c,len_a,len_b); return 0; }

数据结构课后习题

第一章已完成 1 【单选题】 程序段 for(i=n-l;i>l;i--) for(j=1;jA[j+l]) A[j]与A[j+1]对换; 其中n为正整数,则最后一行的语句频度在最坏情况下是()。 A、 O(n) B、 O(nlogn) C、 O(n3) D、 O(n2) 正确答案:D 我的答案:D 答案解析: 当所有相邻元素都为逆序时,则最后一行的语句每次都会执行。此时,4.gif 所以在最坏情况下的该语句频度是O(n2)。 2 【单选题】算法分析的目的是( )。 A、找出数据结构的合理性 B、研究算法中输入和输出的关系 C、分析算法的效率以求改进 D、分析算法的易懂性 正确答案:C 我的答案:C 3 【单选题】 以下算法的时间复杂度为( ) x=0; for(i=1; i

O(n2) 正确答案:D 我的答案:D 4 【单选题】以下说法正确的是()。 A、数据元素是数据的最小单位 B、数据项是数据的基本单位 C、数据结构是带有结构的各数据项的集合 D、一些表面上很不相同的数据可以有相同的逻辑结构 正确答案:D 我的答案:D 5 【单选题】 与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。 A、 存储结构 B、 存储实现 C、 逻辑结构 D、 运算实现 正确答案:C 我的答案:C 6 【单选题】 以下算法中m++;语句的执行次数为()。 int m=0, i, j; for(i=l;i<=n;i++) for(j=1;j<=2 * i;j++) m++; A、 n(n+1) B、 n C、 n+1 D、 n2 正确答案:A 我的答案:A 答案解析: m++语句的执行次数为 5.gif。

大数的阶乘(n!)

信息科学与工程学院 编程设计实验文档 题目:较大数的阶乘 一、设计目的: 1.解决一般大数的阶乘问题,可以避免一般算法实行时的数据溢 出的弊端 2.培养自己对算法的理解,提高自身的水平 3.熟练对c语言的操作,加强对c语言的理解 二、设计分析:

实现一般较小的数的阶乘,可以直接利用普通的乘法进行循环 运算即可,即利用s=n*(n-1)的核心算法。但是,当n比较 大的时候,会造成运算的结果,即s会变得特别大,便会造成 数据溢出。此时,就需要另一种算法,是结果可以保存,不溢 出。那么,这个算法就是要解决这个问题,所以,我想到另一 方式用来解决这个问题,即利用数组。 如下: 首先,定义两个整型的数组: int a[200];//暂且先设定是200位,我称之为“结果数组” int add[200];//我称之为“进位数组” 现在具体说明两个数组的作用: 1.a[200] 比如说,一个数5的阶乘是120,那么我就用这个数组存储它: a[0]=0 a[1]=2 a[2]=1 因此,用这样的数组我们可以放阶乘后是200位的数 2.在介绍add[200]之前,我介绍一下算法的思想,就以6!为 例:

从上面我们知道了5!是怎样存储的。 就在5!的基础上来计算6!,演示如下: fac[0]=fac[0]*6=0 fac[1]=fac[1]*6=12 fac[2]=fac[2]*6=6 3.现在就用到了我们的:“进位数组”add[1000]. 先得说明一下:add[i]就是在第2步中用算出的结果中,第 i位向第i+1位的进位数值。还是接上例: add[0]=0; add[1]=1; // 计算过程:就是 (a[1]+add[0]) % 10=1 add[2]=0; // 计算过程:就是 (a[2]+add[1]) % 10=0 ....... ....... ....... add[i+1] =( a[i+1] + add[i] ) % 10 三、算法流程图

数据结构之大数阶乘

实习一之大数阶乘 // dashujiecheng.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include using namespace std; //链表的类定义 class ChainNode { friend class Chain; private: int data; ChainNode* link; }; class Chain { public: Chain(){first = 0;} ~Chain(); bool IsEmpty() const {return first == 0;} int Length() const; bool Find(int k, int& x)const; int Search(const int& x) const; Chain& Delete(int k, int& x);

Chain& Insert(int k, const int& x); Chain& Change(int k, int x); void OutputOne(const ChainNode* current); void Output(); int OutOfBounds(); private: ChainNode* first; }; //删除链表中的所有节点 Chain::~Chain() { ChainNode * next; while(first) { next = first->link; delete first; first = next; } } //确定链表的长度 int Chain::Length() const { ChainNode* current = first; int len = 0; while(current) { len++; current = current->link;

数据结构 练习题

第1章 概述 一、简答题 1.简述以下术语的含义并说明它们之间的关系。 数据类型、数据结构、逻辑结构、存储结构 2.简述算法时间效率和空间效率的概念。 3.简述数据结构课程的目的和意义。 二、选择题 1.以下数据结构中,逻辑结构属于线性结构的是 A)有向图 B)链式栈 C)二叉树 D)二叉排序树 2.下列与数据元素有关的叙述中错误的是 A)数据元素是有独立含义的数据最小单位 B)数据元素是描述数据的基本单位 C)数据元素可以称做结点 D)数据元素可以称做记录 3.设问题的规模为n,分析以下程序段: a=10; b=100; while (b>0) { a++; b- -; } 以上程序段的算法时间复杂度是 A)O(1) B)O(n) C)O(n2) D)O( ) 三、填空题 1.数据结构包括的三方面内容分别是:数据的 [1] 、数据的 [2] 和数据的运算。2.数据元素是数据的基本单位,在某些情况下也可以称为 [1] 、 [2] 和 [3] 。3.数据逻辑结构的4种基本形态包括集合结构、 [1] 结构、 [2] 结构和 [3] 结构。 4.一个正确的算法应该具有5个特性:[1] 、 [2] 、[3] 、 [4] 和 [5] 。5.数据的存储结构包括顺序、 [1] 、 [2] 和 [3] 四种。 6.一个数据结构在计算机中的映象称为 [1] 。 7.一个算法的效率主要是指该算法的 [1] 效率和 [2] 效率。 8.以下程序段的时间复杂度T(n)= 。 sum=0; for(i=0 ; i

数据结构课后习题标准答案(第二版)

数据结构课后习题答案(第二版)

————————————————————————————————作者:————————————————————————————————日期: 2

数据结构 (C 语言版)(第2 版) 习题解析 揭安全李云清杨庆红编著 江西师范大学计算机信息工程学院 联系方式:janquan@https://www.360docs.net/doc/b717887672.html, 2009 年12 月 2 第1章绪论 1.1 什么是数据结构? 【答】:数据结构是指按一定的逻辑结构组成的一批数据,使用某种存储结构将这批数据存储 于计算机中,并在这些数据上定义了一个运算集合。 1.2 数据结构涉及哪几个方面? 【答】:数据结构涉及三个方面的内容,即数据的逻辑结构、数据的存储结构和数据的运算集 合。 1.3 两个数据结构的逻辑结构和存储结构都相同,但是它们的运算集合中有一个运算的定义不 一样,它们是否可以认作是同一个数据结构?为什么? 【答】:不能,运算集合是数据结构的重要组成部分,不同的运算集合所确定的数据结构是不 一样的,例如,栈与队列它们的逻辑结构与存储结构可以相同,但由于它们的运算集合不一样, 所以它们是两种不同的数据结构。 1.4 线性结构的特点是什么?非线性结构的特点是什么? 【答】:线性结构元素之间的关系是一对一的,在线性结构中只有一个开始结点和一个终端结 点,其他的每一个结点有且仅有一个前驱和一个后继结点。而非线性结构则没有这个特点,元 素之间的关系可以是一对多的或多对多的。 1.5 数据结构的存储方式有哪几种? 【答】:数据结构的存储方式有顺序存储、链式存储、散列存储和索引存储等四种方式。1.6 算法有哪些特点?它和程序的主要区别是什么? 【答】:算法具有(1)有穷性(2)确定性(3)0 个或多个输入(4)1 个或多个输出(5)

经验技巧6-2 大数阶乘优化算法

经验技巧6-2 大数阶乘优化算法 【例6-6】给出了大数阶乘的算法,该算法使用数组存放阶乘的结果,每一个数组元素存放结果的一位。计算十万的阶乘需要近260秒的时间,实际上只要程序中的N足够大,还可以求更大数的阶乘,但程序执行的时间会更长,可能要几个小时,甚至更长,因此需要考虑对算法进行优化。 int型数组的每一个元素可以存放的最大整数为2147483647,是一个十位数,而算法中每一个元素只存放结果的一位,显然太浪费了。 由于算法中需要计算自然数n与数组元素值的乘积加上前一位的进位,所以每个数组元素的位数不能太多,否则将超过最大整数2147483647而导致溢出,如果每个数组元素存放4位数,大约可计算到二十万的阶乘,确保结果是精确的,如果再使用无符号基本整型,大约可计算到四十万的阶乘,确保结果是精确的。 由此,定义符号常量M的值为10000作为模数,符号常量B的值为4表示数组元素存放的最多位数,符号常量N的值为600000表示n!结果位数的B分之一,存放n!结果的数组bit定义为静态无符号基本整型。 计算i!时将原来的用10除处理进位和余数改为用M除。 由于除存放最高位的元素外,每个元素都存放B位,而存放最高位的元素可能不足B位,输出前需先统计存放最高位元素bit[k]的位数,另外,低位的0(只能输出一个0)和不足B位的应使用B个输出域宽,不足的用0补足,才能保证其它各位均输出B位。 其它说明详见程序代码中的注释。 优化的程序代码: (1)#include "stdio.h" (2)#define M 10000//M与n的乘积不能超过4294967295 (3)#define B 4//数组元素存放的最多位数 (4)#define N 600000 //n!的位数,要足够大 (5)int fact(int bit[],int n) (6){ (7)int i,j,k=N-1,carry;//k表示第一个非0元素的下标 (8)bit[k]=1; (9)for(i=2;i<=n;i++) (10){ (11)carry=0;//carry表示进位数,开始进位数为0 (12)for(j=N-1;j>=k;j--) (13){

《数据结构》必须掌握的知识点与算法

《数据结构》必须掌握的知识点与算法 第一章绪论 1、算法的五个重要特性(有穷性、确定性、可行性、输入、输出) 2、算法设计的要求(正确性、可读性、健壮性、效率与低存储量需求) 3、算法与程序的关系: (1)一个程序不一定满足有穷性。例操作系统,只要整个系统不遭破坏,它将永远不会停止,即使没有作业需要处理,它仍处于动态等待中。因此,操作系统不是一个算法。 (2)程序中的指令必须是机器可执行的,而算法中的指令则无此限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。 (3)一个算法若用程序设计语言来描述,则它就是一个程序。 4、算法的时间复杂度的表示与计算(这个比较复杂,具体看算法本身,一般关心其循环的次数与N的关系、函数递归的计算) 第二章线性表 1、线性表的特点: (1)存在唯一的第一个元素;(这一点决定了图不是线性表) (2)存在唯一的最后一个元素; (3)除第一个元素外,其它均只有一个前驱(这一点决定了树不是线性表) (4)除最后一个元素外,其它均只有一个后继。 2、线性表有两种表示:顺序表示(数组)、链式表示(链表),栈、队列都是线性表,他们都可以用数组、链表来实现。 3、顺序表示的线性表(数组)地址计算方法: (1)一维数组,设DataType a[N]的首地址为A0,每一个数据(DataType类型)占m 个字节,则a[k]的地址为:Aa[k]=A0+m*k(其直接意义就是求在数据a[k]的前面有多少个元素,每个元素占m个字节) (2)多维数组,以三维数组为例,设DataType a[M][N][P]的首地址为A000,每一个数据(DataType类型)占m个字节,则在元素a[i][j][k]的前面共有元素个数为:M*N*i +N*j+k,其其地址为:

大数的表示

成绩评定 教师签名 嘉应学院计算机学院 实验报告 课程名称:离散数学 开课学期:2017-2018学年第1学期班级: 指导老师: 实验题目:大数的表示 学号: 姓名:

一、实验目的: 1.掌握大数运算的实现方法 2.理解大数算法 二、实验内容 大数运算加减乘除和阶乘的算法实现 三、上机环境 VS2008 四、实验过程描述 1.大数存储的实现 简单来说,大数算法就是模拟人类的运算过程。作为实现大数存储最常见的一类方法是利用数组。将一个有 n 位的大数存入数组 ,每个数组的一个元素表示一位十进制数 ,若是 n 没有超过普通 PC 机允许的定义范围 ,这种算法是简单易行的。如果出现超大数 ,则可以采用万进制的方法加以存储。 2.大数算法 (1)大数阶乘 原理: 把整个数组看成一个数字,这个数字和一个数相乘的时候,需要每一位都和这个乘数进行相乘运算还需要把前一为的进位加上。运算方法和小学数学是一样的,乘积的个位是当前位上应该表示的数字,10位以上的需要进位。因为乘数不可能大于10000,所以乘数和一个小于10的书相乘的时候不会大于100000,再加上前一位的进位用一个int型数据来保持这个结果就没有问题。写法如下: int 结果 = result[x] * 乘数 + 进位; 每一位的计算结果有了,把这个结果的个位数拿出来放到这个数组元素上:result[x] = 结果%10; 接下来的工作就是计算出进位: 进位 = 结果 / 10; 这样一位一位的把整个数组计算一遍,最后可能还有进位,用同样的方法,把进位的数值拆成单个数字,放到相应的数组元素中。 最后输出一下结果,从最高位吧数字打印一遍就OK了。 源代码: #include using namespace std;

高中数学的阶乘公式大全

高中数学的阶乘公式大全 阶乘(factorial)是基斯顿卡曼(Christian Kramp, 1760 1826)于1808年发明的运算符号。阶乘,也是数学里的一种术语。阶乘只有计算方法,没有简便公式的,只能硬算。以下是小编整理的关于阶乘的相关公式大全,希望能方便大家。 例如所要求的数是4,则阶乘式是1234,得到的积是24,24就是4的阶乘。例如所要求的数是6,则阶乘式是1236,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是123n,设得到的积是x,x就是n的阶乘。 任何大于1的自然数n阶乘表示方法: n!=123n 或 n!=n(n-1)! n的双阶乘: 当n为奇数时表示不大于n的所有奇数的乘积 如:7!!=1357 当n为偶数时表示不大于n的所有偶数的乘积(除0外) 如:8!!=2468 小于0的整数-n的阶乘表示: (-n)!= 1 / (n+1)! 以下列出0至20的阶乘:

0!=1,注意(0的阶乘是存在的) 1!=1, 2!=2, 3!=6, 4!=24, 5!=120, 6!=720, 7!=5,040, 8!=40,320 9!=362,880 10!=3,628,800 11!=39,916,800 12!=479,001,600 13!=6,227,020,800 14!=87,178,291,200 15!=1,307,674,368,000 16!=20,922,789,888,000 17!=355,687,428,096,000 18!=6,402,373,705,728,000 19!=121,645,100,408,832,000 20!=2,432,902,008,176,640,000 另外,数学家定义,0!=1,所以0!=1!

数据结构重点习题

数据结构习题 1、设有数据结构(D,R),其中 D={d1,d2,d3,d4,} R={(d1,d2),(d2,d3),(d2,d4)} 画出它的逻辑结构图。 2、计算下列程序段的时间复杂度 s=0; for(j=1;j<=n;j*=2) for(k=1;k<=n;++k) {s++;} 3、求整数n(n≥0)阶乘的算法如下,其时间复杂度是多少? int fact(int n) { if(n<=1) return 1; return n*fact(n-1); } 4、用C或C++语言描述下列算法,并给出算法的时间复杂度。 (1)求一个n阶方阵的所有元素之和。 (2)对于输入的任意三个整数,将它们按从小到大的顺序输出。 (3)对于输入的任意n个整数,输出其中的最大元素和最小元素。 5、编写从顺序表中删除其值等于X的所有元素的算法。 6、设计一个算法,将x插入到一个有序(从小到大排序)的线性表(顺序存储结构)的适当位置上,并保持线性表的有序性。 7、设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面尽可能高效的算法。将R中的序列循环左移P(0

相关文档
最新文档