文档库 最新最全的文档下载
当前位置:文档库 › 1到100阶乘和

1到100阶乘和

1到100阶乘和
1到100阶乘和

#include

#define N 100000

#define M 100

static x=0,y=0,b[N]={0};

void main()

{

int i,j,k;

int a[N]={1};

for(j=1;j<=M;j++)

{

for(i=0;i<=x;i++)

a[i]*=j;

for(i=0;i

if(a[i]>=10)

{

a[i+1]+=a[i]/10;

a[i]=a[i]%10;

x=i+1;

}

for(i=0;i<=x;i++)

{

b[i]+=a[i];

if(b[i]>=10)

{

b[i+1]+=b[i]/10;

b[i]=b[i]%10;

y=i+1;

}

}

}

printf("%d!阶乘为:\n",M);

for(i=x;i>=0;i--)

printf("%d",a[i]);

printf("\n");

printf("%d!阶乘位数为:%d \n",M,x+1);

printf("%d!阶乘和为:\n",M);

for(i=x;i>=0;i--)

printf("%d",b[i]);

printf("\n");

}

阶乘运算

//阶乘各算法的 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,求n!,同时统计结果中有几个0。 二、课题分析 1)计算n!。 2)统计0的个数。 三、数据结构的设计 x:输入的数n i:n! b:储存数据i上的各位上的数,从而判断b是否为0 j:统计0的个数 四、处理结构的设计 建立两个函数f1和f2,使f1函数起到求阶乘的作用,f2函数起到求0个数的作用。

求阶乘流程图

计算0的个数流程 五、源程序 1)主要结构体: f1函数: long int f1(int x) { long int i; //声明长整型变量i if (x==0||x==1) //采用递归函数f1求阶乘i=1; else i=f1(x-1)*x; return (i); }

f2函数: int f2(int i) {int j=0; int b=0; while(i>=10) //循环结构,判断末位是否为零,再去末位{b=i %10; if(b==0)j++; i=i/10; } return (j); } 2)整体: #include long int f1(int x) { long int i; if (x==0||x==1) i=1; else i=f1(x-1)*x; return (i); } int f2(int i) {int j=0; int b=0; while(i>=10) {b=i %10; if(b==0)j++; i=i/10; } return (j); } void main() {long int f1(int x); int f2(int x); long int k; int n,i; printf("please input n:"); scanf("%d",&n); k=f1 (n); i=f2 (k); printf("%d! is %ld\nthere are %d zero!\n",n,k,i);

过万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这个成员

关于阶乘的程序编写

数的阶乘 很多教材中的阶乘程序只是简单地用了阶乘的定义,算法比较简单,考虑也不够全面,其相应的程序如下: /* 数的阶乘(经典版)*/ #include"stdio.h" main() { extern jiecheng(int n); int n; printf("请输入一个数:"); scanf("%d",&n); jiecheng(n); } extern jiecheng(int n) { long result=1; int i; for(i=1;i<=n;i++) result*=i; printf("该数的阶乘为:%ld\n",result); } 该函数在参数n比较小的时候运行完全正常,但是随着n变大(如,超过12)就出现

了问题,结果会溢出而变成意料之外的数据,究其原因,是因为任何基本类型的变量都有一定的表示范围。要计算更大参数的阶乘,可以使用数组存放阶乘结果,于是有了下面的程序: /* 数的阶乘(改进版)*/ #include"stdio.h" main() { int n; printf("请输入一个数:"); scanf("%d",&n); jiecheng(n); } int jiecheng(int n) { int m,i,j,c,t,a[1000]; a[0]=1; m=1; for(i=2;i<=n;i++) { for(c=0,j=0;j

} while(c) { a[m++]=c%10; c/=10; } } printf("该数的阶乘为:"); for(j=m-1;j>=0;j--) printf("%d",a[j]); printf("\n"); } 这样一来,就可以计算大数的阶乘了。如有疑问,多谢赐教!

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,如

采用汇编语言实现阶乘运算

汇编语言程序设计报告 课程设计题目:采用汇编语言实现阶乘运算 学号:10081437 姓名:张子琦 院系:测试与光电工程学院 专业:测控技术与仪器 指导教师:陈振华

采用汇编语言实现阶乘运算 学生姓名:张子琦班级:10081437 指导老师:陈振华 摘要:汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。因此掌握汇编语言是学好微机原理和接口设计的第一步。编写计算N!的程序。数值由键盘输入,结果在屏幕上输出。[1] 关键字:汇编语言N!键盘输入屏幕输出 指导老师签名:

Factorial implemented in assembly language Student name :Ziqi Zhang Class:10081437 Supervisor:Zhenhua Chen Abstract:Assembly language is the basis of the principles and applications of the microcomputer, the microcomputer host functions and interfaces to achieve should be achieved through the assembly language. Despite the low efficiency of assembly language programming programming, but it’s high operating efficiency, and speed. Therefore, the assembly language is the first step to learn Microcomputer Principle and Interface Design. Written calculation of N! Procedures. Numerical keyboard input, output results on the screen. Key words:Assembly language N! Keyboard input Screen output Signature of Supervisor:

大数乘法

大数乘法 (一)介绍: 还是模拟的方法,用数组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; }

阶乘排列组合公式计算

阶乘排列组合公式计算 加法原理:做一件事,完成它可以有N类加法,在第一类办法中有M1种不同的方法,在第二类办法中有M2种不同的方法,……,在第N类办法中有MN种不同的方法。那么完成这件事共有N=M1+M2+...+MN 种不同的方法。即一次性完成的用加法原理。 乘法原理:做一件事,完成它需要分成N个步骤,做第一步有M1种不同的方法,做第二步有M2种不同的方法,……,做第N步有MN种不同的方法,那么完成这件事共有 N=M1×M2×... ×MN 种不同的方法。即二次以上完成的用乘法原理。 排列:从N个不同元素中,任取M(M<=N)个元素,按照一定的顺序排成一列,叫做从N个不同元素中取出M个元素的一个排列。 排列数:从N个不同元素中取出M(M<=N)个元素的所有排列的个数,叫做从N个不同元素中取出M个元素的排列数。记作:Pmn 排列数公式:Pmn =n(n-1)(n-2)...(n-m+1) 全排列:N个不同元素全部取出的一个排列,叫做N个不同元素的一个全排列。 自然数1到N的连乘积,叫做N的阶乘。记作:n! 。0!=1。 全排列公式:Pnn =n! 排列数公式还可写成:Pmn = n!/(n-m)! 组合:从N个不同元素中,任取M(M<=N)个元素并成一组,叫做从N个不同元素中取出M个元素的一个组合。 排列与元素的顺序有关,组合与元素的顺序无关。 组合数:从N个不同元素中取出M(M<=N)个元素的所有组合的个数,叫做从N个不同元素中取出M个元素的组合数。记作:Cmn 组合数公式:Cmn = Pmn / Pmm = n(n-1)(n-2)...(n-m+1)/m! = n!/m!/(n-m)! 组合性质1:Cmn = Cn-mn ( C0n =1) 组合性质2:Cmn+1 = Cmn + Cm-1n

数据结构课后习题

第一章已完成 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 三、算法流程图

VB程序设计-多种方法求阶乘

VB程序设计-多种方法求阶乘 (作者:草原飞狼 2014年5月26日) 声明:仅供学习与交流使用,高手请飘过,谢谢! 布局 运行界面(1)

运行界面(2) 源代码如下: Private Sub Command1_Click() Rem 求任意数阶乘,不大于171 Dim mul As Double Dim i As Integer Dim k As Integer mul = 1 '赋初值 k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下算法是求指定数的阶乘,典型的算法 For i = 1 To k mul = mul * i Next i Print k & "的阶乘结果是:"; mul End Sub Private Sub Command2_Click() Rem 清空 Form1.Cls End Sub Private Sub Command3_Click() Rem 退出 Unload Me End Sub Private Sub Command4_Click()

Rem 普通过程求阶乘 Dim mul As Double Dim i As Integer Dim k As Integer mul = 1 '赋初值 k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下算法是求指定数的阶乘 Call fac(k) '函数调用,注意调用方法 Print k & "的阶乘结果是:"; fac(k) End Sub Private Function fac(ByVal k As Integer) As Double 'byval表示参数按值传递Rem 普通的函数过程 Dim i As Integer Dim mul As Double mul = 1 For i = 1 To k mul = mul * i Next i fac = mul '结果返回给函数,典型的用法End Function Private Sub Command5_Click() Rem 递归过程求阶乘 Dim i As Integer Dim k As Integer Dim mul As Double mul = 1 '赋初值 k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下递归函数的调用 Call fac_digui(k) Print k & "的阶乘结果是:"; fac_digui(k) End Sub Private Function fac_digui(ByVal k As Integer) As Double Rem 递归过程求阶 Rem 以下是递归算法求阶乘,注意写法,编写递归算法时,方法类似 If k = 1 Then fac_digui = 1 Else fac_digui = fac_digui(k - 1) * k End If End Function

数据结构之大数阶乘

实习一之大数阶乘 // 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

相关文档