汇编计算数的阶乘,可计算1000万内的数的阶乘
汇编计算数的阶乘,可计算1000万内的数的阶乘
本程序作者cabbage功能:计算1亿以内数的阶乘E-mail:1225673051@;**********************求阶乘程序,十进制输入一个数,十进制输出其结果*********************STROUT MACRO ;宏,DOS功能调用,设置字符串输出入口参数MOV AH,09HINT 21HENDMCHAR_IN MACRO ;宏,DOS功能调用,设置字符输入入口参数MOV AH,01HINT 21HENDMDATAS SEGMENT PUBLICDATA1 DB 10H DUP(0)LEN1 DW ?LEN2 DW ?CONST1 DW 30CONST2 DW 40INDEX DB 10H DUP(0)STR0 DB '********************FACTORIAL**********************$'STR1 DB 0AH,0DH,'Please input the num:$'STR2 DB 0AH,0DH,'Error!$'STR3 DB 0AH,0DH,'The result is:$'STR4 DB 0AH,0DH,'****************************************************$'STR5 DB 0AH,0DH,'Thank you for using!$'DATA3 DB 0FF24H DUP(0)DATAS ENDSDATAS1 SEGMENT PUBLICDB 0FFFFH DUP(0)DATAS1 ENDSDATAS2 SEGMENT PUBLICDATA2 DB 0FFFFH DUP(0)DATAS2 ENDSDATAS3 SEGMENT PUBLICDB 0FFFFH DUP(0)DATAS3 ENDSSTACKS SEGMENT STACKDW 2000H DUP(?)TOP LABEL WORDSTACKS ENDSCODES1 SEGMENTASSUME CS:CODES1,DS:DATAS,SS:STACKS,ES:DATAS2START:MOV AX,DATASMOV DS,AXMOV AX,STACKSMOV SS,AXMOV AX,DATAS2MOV ES,AXMOV SP,OFFSET TOPMOV LEN1,OFFSET DATA2MOV LEN2,OFFSET DATA3MOV DX,OFFSET STR0STROUTs1:CALL ZERO ;清零DATA1,DATA2,DATA3,INDEX,为保证运行结果不受前次影响XOR AX,AXXOR BX,BXXOR CX,CXXOR DX,DX ;清零AX,BX,CX,DX等寄存器,为保证运行结果不受前次影响MOV DX,OFFSET STR1STROUTXOR SI,SIdo1:CHAR_INCMP AL,0DHJZ d1CMP AL,'0'JB errorCMP AL,'9'JA errorSUB AL,'0'MOV DS:BYTE PTR [SI],AL ;输入原始数据,按位输入,高位先输INC SIJMP do1d1:CMP SI,0JZ exitMOV CX,SIXOR DI,DIdo2:MOV AL,DS:BYTE PTR [SI-1]MOV ES:BYTE PTR DATA2[DI],AL ;先给DATA2中赋值,使其等于输入的数据INC DIDEC SILOOP do2MOV CX,DIXOR SI,SIXOR DI,DIdo3:MOV AL,ES:BYTE PTR DATA2[DI]MOV DS:BYTE PTR [SI],ALINC DI ;再将DATA1中的数据实现,高位存放在地址较大的存储单元INC SILOOP do3s2:XOR AX,AXCALL FAR PTR FAC ;调用阶乘计算函数CMP SI,1 ;当还没有计算到1时,再次进入阶乘函数JNZ s2MOV AL,DS:BYTE PTR [SI-1]CMP AL,1JZ s3JMP s2s3:CALL FAR PTR RESULT ;输出结果JMP s1error:MOV DX,OFFSET STR2STROUTJMP s1exit:MOV DX,OFFSET STR5STROUTMOV AH,4CHINT 21HCODES1 ENDS;*********************************************************CODES2 SEGMENTASSUME CS:CODES2,DS:DATAS,SS:STACKS,ES:DATAS2;递归子过程,计算阶乘,没当递归次数大于等于5000时,返回再次进入,降低栈对递归的限制FAC PROC FARINC AXPUSH AXdo6:MOV AL,ES:BYTE PTR DATA2[DI-1]DEC DICMP AL,0JZ do6INC DICMP DI,CONST2JB s4CALL FAR PTR DZEROs4:CMP SI,1JNZ s5MOV AL,DS:BYTE PTR [SI-1]CMP AL,1JZ s9JMP s6s5:MOV CX,SIDEC CXXOR BP,BPMOV AL,DS:BYTE PTR [BP]SUB AL,1PUSHFAASMOV DS:BYTE PTR [BP],ALdo4:INC BPMOV AL,DS:BYTE PTR [BP]POPFSBB AL,0PUSHFAASMOV DS:BYTE PTR [BP],ALLOOP do4POPFMOV AL,DS:BYTE PTR [SI-1]CMP AL,0JNZ s7DEC SIJMP s7s6:MOV AL,DS:BYTE PTR [SI-1]SUB AL,1MOV DS:BYTE PTR [SI-1],ALs7:CALL FAR PTR MULTPOP AXCMP AX,1388HJZ s8CALL FAR PTR FACs8:RETs9:POP AXRETFAC ENDPCODES2 ENDS;*********************************************************;乘法运算函数,用于多位非压缩码BCD数(DATA1)与多位非压缩码BCD数(DATA2)的乘法运算;,并将结果存放在DATA2中。
10000的阶乘的算法(大数的阶乘)
10000的阶乘的算法(⼤数的阶乘)很多天没有更新⾃⼰的Blog了,前⼏天拿到⼀个题⽬.就是写⼀段程序计算10000的阶乘.当时我还以为这题⽬⾮常简单,没想到还是需要动点⼤脑的.花了将近半个⼩时才搞定,拿出来分享⼀下.为什么不能⽤普通的⽅法来写呢,⽐如说递归?在我的教科书上可是⽤的是递归呀?不知道你注意没有,如果是100的阶乘的话,其结果肯定是⾮常⼤的,以我们现有语⾔的数据类型肯定是没法使⽤的,就拿C来说,long型能存的下100的阶乘吗?未必.所以我就使⽤数组来存储结果的每⼀位,然后输出每⼀位不就是结果吗.那么具体怎样去做?⾸先确定结果的位数?如何确定呢?请看下⾯.2!=1*2<=10*103!=1*2*3<=10*10*10.......所以我们可以得出⼀个结论n!<=10n所以n!的位数可以这样计算:两边取对数,即log10n!<=log1010n两边n>=Log101+Log102+Log10 3+....Log10 n这样n!的位数肯定等于⼩于Log101+Log102+Log10 3+....Log10 n.以上是错误的正确的推断如下:可以将n!表⽰成10的次幂,即n!=10^M(10的M次⽅)则不⼩于M的最⼩整数就是 n!的位数,对该式两边取对数,有 =log10^n!即:M = log10^1+log10^2+log10^3...+log10^n循环求和,就能算得M值,该M是n!的精确位数。
位数的确定解决之后,就看看如何计算了.看看如下代码:1int index=0;2long carrier=0;3double bitCount = 1;4int begin = 0;56for(index=2; index<=n; ++index)7 {8long multiValue = 0;9 bitCount += log10((long double)index);10if(arrValue[begin] == 0)11 begin++;1213for(int j=begin; j<int(bitCount); ++j)14 {15 multiValue += (index*arrValue[j]);16 arrValue[j] = char(multiValue % 10);17 multiValue /= 10;18 }19 }这⾥就是计算的关键了.注意⼀下进位问题即可.所有代码如下:12//////////////////////////////////////////////////////////////////////////3// Date created: 2005/07/124// Author: Confach Zhang5// Purpose: 计算n!的值6//////////////////////////////////////////////////////////////////////////789using namespace std;10#include "StdAfx.h"11#include <iostream.h>12#include <conio.h>13#include <stdlib.h>14#include <math.h>15#include <stdio.h>16#include <iomanip.h>1718int GetNumber(); //输⼊ n19int GetBitLength(int n); //求n!的位数20char* Initialize(int); //初始化存储结果的值21void PrintValue(char *a,int size); //打印值到屏幕22void PrintValue(char *a,int size,char* fileName); //打印值到⽂件 23char* GetValue(int val); //计算24char* SubGetValue(char* ,int);252627int main()28{29int value=GetNumber();30char fileName[16];31int size=GetBitLength(value);32char *pa = Initialize(size);3334//pa=GetValue();35 pa=GetValue(value);3637 PrintValue(pa,size);3839//sprintf(fileName,"%s","10000!.txt");40 sprintf(fileName,"%d!.txt",value);4142 PrintValue(pa,size,fileName);43 delete []pa; //note:44return 1;45}46//函数GetValue47// 求得计算结果48//返回结果49//History:50//1)char* GetValue()51//2)GetValue(int val)52// 参数:val 计算阶乘的值53char* GetValue(int val)54{55//定义⼀个数组存储阶乘的值56 //⾸先得到10000!阶乘的位数57int VALUE=val;58int length=GetBitLength(VALUE);59char *arrValue = new char[length];60if(!arrValue) {61 cout <<"申请内存失败!" << endl;62 exit(1);63 }64 arrValue[0] = 1;65for(int i=1; i<length; i++)66 arrValue[i] = 0;67 arrValue=SubGetValue(arrValue,VALUE);68return arrValue;69}7071char* SubGetValue(char* arrValue,int n)72{73int index=0;74long carrier=0;75double bitCount = 1;76int begin = 0;7778for(index=2; index<=n; ++index)79 {80long multiValue = 0;81 bitCount += log10((long double)index);82if(arrValue[begin] == 0)83 begin++;8485for(int j=begin; j<int(bitCount); ++j)86 {87 multiValue += (index*arrValue[j]);88 arrValue[j] = char(multiValue % 10);89 multiValue /= 10;90 }91 }92return arrValue;93}9495//得到计算阶乘的值,此函数为新增96int GetNumber()97{98int n;99 cout << "请输⼊要计算阶乘的n值: ";100 cin >> n;101while(n < 0) {102 cout << "输⼊错误,请重新输⼊: ";103 cin >> n;104 }105if(n == 0)106 exit(1);107return n;108}109110//函数GetBitLength111// 求得计算结果的位数,本函数为新增加112//参数113// n 需要计算的阶乘的数114//返回结果的位数115int GetBitLength(int n)116{117double sum = 1.0;118for(int i=1; i<=n; i++)119 sum += log10((long double)i);120return int(sum);121}122//-----------123//函数:Initialize124// 初始化存储结果的数组125//参数:126// size 数组的长度127//返回值128// 初始化后的数组129//-------------130char * Initialize(int size)131{132char *arrValue = new char[size];133if(!arrValue) {134 cout << size<<"太⼤,申请内存失败!" << endl; 135 exit(1);136 }137 arrValue[0] = 1;138for(int i=1; i<size; i++)139 arrValue[i] = 0;140return arrValue;141}142143//-----------144//函数:PrintValue145// 将结果输⼊到屏幕上146//参数:147// buff 存储结果的数组148// buffLen 数组的长度149// fileName ⽂件名150//-------------151void PrintValue(char *buff, int buffLen)152{153int bit = 0;154int nCol=0;155for(int i=buffLen-1; i>=0; i--) {156if(bit % 10 == 0)157 {158 cout << " " ;159 nCol++;160if(nCol==10)cout<<endl;161 }162 cout << int (buff[i]);163 bit++;164 }165 cout << endl;166167}168//-----------169//函数:PrintValue170// 将结果输⼊到⼀个⽂件中171//参数:172// buff 存储结果的数组173// buffLen 数组的长度174// fileName ⽂件名175//-------------176177void PrintValue(char *buff,int buffLen,char *fileName) 178{179int bit = 0;180int nCol=0;181182 FILE *fp=NULL;183//-----------------------------184185if (fileName==NULL) return ;186 fp=fopen(fileName,"wt");187if (fp==NULL)188 {189 printf("不能创建⽂件%s",fileName);190return ;191 }192193for(int i=buffLen-1; i>=0; i--)194 {195 fprintf(fp,"%d",int(buff[i]));196197if(bit % 9 == 0)198 {199 fprintf(fp,"%s"," ");200 nCol++;201if(nCol==8)202 {203 fprintf(fp,"%s","\n");204 nCol=0;205 }206 }207 bit++;208209 }210 fprintf(fp,"\n");211 fclose(fp);212}213好了,不说了.Last Updated: 2005年7⽉14⽇12:43:07 感谢的建议Last Updated: 2005年7⽉15⽇ 8:48:20 感谢的精彩建议posted on 2005-07-14 12:17 阅读(1260) 所属分类:re: 10000的阶乘 2005-07-14 12:34@Milestone能写多点⽂字吗?⽐如说说,⽤普通的递归会出现什么问题和不⾜你的这种新⽅法的原理是什么,关键的技术点⼜在哪?这样⼀堆代码,我真的看不懂,可能我技术太菜了;)*¥—#**re: 10000的阶乘 2005-07-14 12:36@kwklover谢谢你的提议,有空我写上.re: 10000的阶乘 2005-07-14 13:13普通的递归不⾏猜想原因是C的标准数据类型有可能不能保存结果那么⼤的数值。
计算整数的阶乘(Python)
计算整数的阶乘(Python)阶乘是一个自然数逐渐减小并相乘的过程。
对于整数n,其阶乘表示为n!,定义为所有小于或等于n的正整数的积。
计算整数的阶乘是一项非常基础的数学运算,同时也是编程中常见的问题之一。
在本文中,我们将介绍如何使用Python编程语言来计算整数的阶乘,并对阶乘的相关知识进行一些拓展和探讨。
首先,我们来介绍一下如何使用Python来计算整数的阶乘。
Python是一种简洁而强大的编程语言,对于小到中等规模的计算问题,它非常适用。
计算整数的阶乘正是其中之一。
在Python中,可以使用递归或循环的方式来计算整数的阶乘。
首先,我们来看一下使用递归的方法。
递归是一种函数直接或间接调用自身的编程技巧,对于阶乘这种问题,递归的解决方案非常简洁明了。
下面是一个使用递归来计算整数阶乘的Python代码:```pythondef factorial_recursive(n):if n == 1:return 1else:return n * factorial_recursive(n-1)```上面这段代码定义了一个名为`factorial_recursive`的函数,该函数接受一个整数n作为参数,并返回n的阶乘。
在函数体内部,我们使用了`if`语句来判断n是否等于1,如果是,则返回1;如果不是,则返回n与`factorial_recursive(n-1)`的乘积。
这样,就可以通过递归的方式来不断地将n减小,直到计算出1的阶乘,从而得到整个阶乘的结果。
除了递归,我们还可以使用循环的方式来计算整数的阶乘。
下面是一个使用循环来计算整数阶乘的Python代码:```pythondef factorial_iterative(n):result = 1for i in range(1, n+1):result *= ireturn result```在这段代码中,我们定义了一个名为`factorial_iterative`的函数,接受一个整数n作为参数,并返回其阶乘。
c的阶乘计算例子
c的阶乘计算例子c语言中,阶乘是一种常见的数学运算,用于计算一个数的阶乘。
阶乘的定义是:n的阶乘(n!)表示从1到n所有正整数的乘积。
下面是一些使用c语言计算阶乘的例子,每个例子都使用了不同的方法或技巧来计算阶乘。
1. 使用for循环计算阶乘:```#include <stdio.h>int factorial(int n) {int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;}int main() {int n = 5;int result = factorial(n);return 0;}```这个例子使用了for循环来计算阶乘。
通过遍历从1到n的所有数,将它们相乘得到阶乘的结果。
2. 使用递归计算阶乘:```#include <stdio.h>int factorial(int n) {if (n == 0) {return 1;} else {return n * factorial(n - 1);}}int main() {int n = 5;int result = factorial(n);return 0;}```这个例子使用了递归来计算阶乘。
当n等于0时,阶乘的结果为1;否则,阶乘的结果为n乘以n-1的阶乘。
3. 使用while循环计算阶乘:```#include <stdio.h>int factorial(int n) {int result = 1;int i = 1;while (i <= n) {result *= i;i++;}return result;}int main() {int n = 5;int result = factorial(n);printf("%d的阶乘是:%d\n", n, result);return 0;}```这个例子使用了while循环来计算阶乘。
汇编子程序设计阶乘
汇编子程序设计阶乘汇编语言是一种底层的程序语言,用于编写机器指令的程序。
子程序设计是汇编语言的一个重要概念,用于将程序模块化以便重复使用。
阶乘是一个经典的数学问题,定义为对于正整数n,阶乘的值表示为n!,等于从1到n的所有正整数相乘的结果。
例如,5!=5×4×3×2×1=120。
在汇编语言中,实现阶乘可以通过递归或迭代的方式完成。
下面我们将详细讨论这两种方法。
一、递归方式实现阶乘:递归方式是一种将问题分解为更小规模的子问题的编程技术。
在实现阶乘时,可以通过递归方式计算出n-1的阶乘,然后将结果与n相乘得到n。
以下是使用递归方式实现阶乘的汇编代码示例:```assemblysection .dataresult db 1section .textglobal _start_start:mov eax, 5call factorialmov [result], eax;此处可添加输出结果的代码mov eax, 1int 0x80factorial:push ebpmov ebp, espmov eax, [ebp+8] ; 读取传入的参数n cmp eax, 1jle end_factorialdec eaxpush eaxcall factorialpop eaximul eax, [ebp+8] ; 计算阶乘结果end_factorial:mov esp, ebppop ebpret```以上代码中,_start是程序的入口点。
我们传入参数5给阶乘的子程序,然后将结果存储在result变量中。
请注意,在第一个call指令后,我们将使用eax寄存器存储结果。
factorial是计算阶乘的子程序。
我们通过比较n是否小于等于1来确定是否终止递归。
如果n大于1,则我们将n减1,并将其压入栈中作为下一次递归的参数。
然后,我们通过调用相同的子程序计算n-1的阶乘结果。
c语言填空题求n的阶乘程序
c语言填空题求n的阶乘程序阶乘是指将一个正整数 n 与 n-1、n-2、n-3...1 相乘,即 n! = n * (n-1) * (n-2) * ... * 1。
编写一个 C 语言程序,通过填空的方式求给定正整数 n 的阶乘。
下面是完整的代码:```c#include <stdio.h>long long factorial(int n) {long long result = 1;for(int i = 1; i <= n; i++) {result *= i;}return result;}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);long long result = factorial(n);printf("%d的阶乘是:%lld\n", n, result);return 0;}```在这个程序中,我们使用了一个名为 factorial 的函数来计算阶乘。
该函数接受一个整数参数 n,并返回一个 long long 类型的结果。
在主函数 main 中,我们首先定义了一个整数变量 n,用于存储用户输入的正整数。
然后通过 scanf 函数向用户请求输入一个正整数,并将其保存到变量 n 中。
接下来,我们调用 factorial 函数,传入变量 n 作为参数,并将返回的结果保存到变量 result 中。
最后,使用 printf 函数打印出计算得到的阶乘结果。
这个程序的运行流程如下:1. 用户输入一个正整数。
2. 程序调用 factorial 函数,传入用户输入的正整数,并计算阶乘结果。
3. 阶乘结果被保存在 result 变量中。
4. 程序打印出计算得到的阶乘结果。
注意,本程序使用了 long long 类型来存储阶乘结果,以保证在计算大数阶乘时不会溢出。
阶乘是怎么算的
阶乘是怎么算的讲述阶乘是计算一个数的乘积的方法,结果是一个长整数。
它可以有几种不同的写法,但是其原理基本如下:给定一个正整数n,求n阶乘表示为n!,即n! = 1×2×3×...×n。
例如,5阶乘表示为5!,即5! = 1×2×3×4×5 = 120。
阶乘是常用的计算方法,常见于数学表达式中,如阶乘表示采用数学符号n!,表示为n! = 1×2×3×4×...×n。
在计算机科学中,阶乘也有不同种类的应用,如用于求解某数的阶乘,用于求解对应的组合数或定积分等。
从数学上讲,阶乘可以用递归函数来表示,即设f(n) = n * f (n-1),这意味着求n阶乘只需通过计算f(n-1)值就可以求出n!。
例如,要计算 5!,只需求解出f(4),即4! = 24即可得到5! = 120。
Java语言实现阶乘的递归,可写入以下代码://并返回long型的结果public static long factorial(long num){//当我们计算到1时,终止计算if(num==1){return 1;}//通过递归调用计算更小的阶乘return num*factorial(num-1);}计算机中的阶乘也应用于实际问题,最常见的例子是抛硬币,抛n次硬币得到字母A到H,那么求出这种情况下字母ABCD...H出现的概率,应用阶乘即可求解。
例如,假设抛四次硬币,用A、B、C、D表示得到的正面或反面,那么得到ABCD的概率是怎样的呢?答案即为把相应的概率项目乘起来,有:P(ABCD)=P(A)P(B)P(C)P(D)其中,P(A)表示得到A的概率,P(B)表示得到B的概率,P(C)表示得到C的概率,P(D)表示得到D的概率,由于只有正反面,因此P(A) = P(B) = P(C) = P(D) = 1/2。
计算任意整数的阶乘
计算任意整数的阶乘
//1.阶乘也叫階乘,是一个非负整数的函数,这个整数的阶乘是这个数乘以所有小于它的正整数的乘积,直到1,也就是说n的阶乘就是
n!=nx(n-1)x(n-2)x (x2x1)
//2.计算任意整数的阶乘,可以使用循环的方式来实现,可以使用for循环或者while循环,下面给出一个使用for循环实现的阶乘计算代码:
//int factorial (int n)
// int sum = 1;
// for(int i = n; i > 0; i--)
// sum *= i;
// return sum;
//}
//上面的代码使用for循环,从输入的n开始,逐渐减小,直到1,将这每一次的结果相乘,就得到了n的阶乘结果。
//3.另外,还有一种更简单的方法来实现计算任意整数的阶乘,这种方法叫做递归,即一个函数调用自身来实现。
下面给出一个使用递归实现的阶乘计算代码:
//int factorial (int n)
//if (n == 1)
//return 1;
//return n * factorial(n-1);
//}
//上面的代码使用了递归,当n等于1的时候,就返回1,否则就调
用自身来递归计算,直到n等于1时停止,然后将计算的结果按顺序相乘,就得到了n的阶乘结果。
//4.不论使用什么方法实现,需要注意的是,0的阶乘为1,负数的
阶乘没有意义,因此不能计算负数的阶乘。
//总之,任意整数的阶乘可以使用循环的方式或者递归的方式来实现,这两种方式都可以得到一个序列,将这个序列中的每一个数相乘,就能得
到任意整数的阶乘。
计算整数的阶乘(Python)
计算整数的阶乘(Python)阶乘是一个非常基础且重要的数学概念,它在数学、计算机科学和统计学等领域中都有广泛的应用。
阶乘是指从1乘到某个正整数n 的连续乘积,表示为n!。
根据定义,0的阶乘是1。
在Python中,我们可以使用循环或者递归的方式来计算一个整数的阶乘。
下面我们将介绍这两种方法,并给出示例代码。
首先,我们来看使用循环计算整数阶乘的方法。
这种方法基于连续乘积的原理,从1乘到n,依次将每个数字相乘,并将结果保存在一个变量中。
遍历完成后,变量的值就是所求整数的阶乘。
下面是使用循环计算整数阶乘的示例代码:```pythondef factorial(n):result = 1for i in range(1, n+1):result *= ireturn result#测试n = 5print("{}的阶乘为:{}".format(n, factorial(n)))```以上代码中,我们定义了一个名为`factorial`的函数,它接受一个整数`n`作为参数,并通过循环计算`n`的阶乘。
在每次循环中,将当前数字`i`与结果变量`result`相乘,并将结果赋值给`result`。
最后,函数返回结果变量`result`的值。
接下来,我们来看使用递归计算整数阶乘的方法。
递归是一种自我调用的方式,通过将大问题划分为更小的子问题来求解。
对于求解阶乘来说,可以将问题划分为计算`n-1`的阶乘,并将结果乘以`n`。
递归的终止条件是`n`为1时,返回1。
下面是使用递归计算整数阶乘的示例代码:```pythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)#测试n = 5print("{}的阶乘为:{}".format(n, factorial(n)))```以上代码中,我们定义了一个名为`factorial`的函数,它通过判断`n`是否为0或1来确定是否终止递归。
java计算阶乘并输出算式
java计算阶乘并输出算式Java作为目前比较流行的编程语言之一,常常被用于大型软件系统的开发,而阶乘计算也是一个比较基础的算法,学习Java编程的初学者都需要了解这个算法,本文就将围绕Java计算阶乘并输出算式,为大家详细地讲解一下。
1. 程序结构分析在我们开始编写Java程序之前,我们首先要理解阶乘的计算规则。
n阶乘的计算方法可以用公式表示:n!=n×(n-1)×(n-2)×...×1,其中n是正整数。
因此,我们可以通过循环的方式,从1开始到n逐个相乘,得到n的阶乘。
为了便于输出阶乘的算式,我们还需要定义一个变量或数组,用于存储每个乘数。
2. 具体实现过程Java程序的实现过程可分为以下几个步骤:2.1 输入n的值阶乘的计算需要知道n的值,我们可以调用Java中的Scanner 类获取控制台输入的值。
代码示例如下:```Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();```2.2 定义乘数数组为了将每个乘数保存下来,方便输出算式和结果,我们需要定义一个n个元素的数组。
代码示例如下:```int[] nums = new int[n];```2.3 计算阶乘根据阶乘计算规则,我们可以通过一个循环语句,从1到n逐个相乘,得到n的阶乘。
代码示例如下:```int fact = 1;for(int i = 1; i <= n; i++){fact *= i;nums[i-1] = i;}```由于循环变量i从1开始,而数组下标从0开始,为了方便输出算式,我们需要在每个乘数存储时,将下标减1。
2.4 输出算式和结果计算完成后,我们可以通过Java中的System.out.println()方法将阶乘的算式和结果输出。
代码示例如下:```System.out.print(n + "! = ");for(int i = 0; i < nums.length; i++){System.out.print(nums[i]);if(i < nums.length-1)System.out.print("×");}System.out.println(" = " + fact);```3. 示例代码下面是一个完整的Java程序,实现了计算阶乘并输出算式的功能:```import java.util.Scanner;public class Factorial {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] nums = new int[n];int fact = 1;for(int i = 1; i <= n; i++){fact *= i;nums[i-1] = i;}System.out.print(n + "! = ");for(int i = 0; i < nums.length; i++){System.out.print(nums[i]);if(i < nums.length-1)System.out.print("×");}System.out.println(" = " + fact);scanner.close();}}```4. 总结本文从程序结构分析、具体实现过程和示例代码三个方面详细阐述了如何使用Java计算阶乘并输出算式。
php递归阶乘求和
php递归阶乘求和随着计算机技术的发展和应用的广泛,编程语言也越来越多,其中PHP是一种非常流行的编程语言。
在PHP中,递归是一种非常重要的编程技术,它可以帮助我们解决很多复杂的问题。
本文将介绍如何使用PHP递归阶乘求和。
什么是阶乘?阶乘是一个非常基本的数学概念,它表示一个正整数n与n-1,n-2,...,1之间所有整数的乘积。
例如,5的阶乘是5x4x3x2x1=120。
阶乘在数学、计算机科学、物理学等领域中都有广泛的应用。
如何使用PHP计算阶乘?在PHP中,计算阶乘的方法非常简单。
我们可以使用for循环或while循环来实现。
例如,下面的代码可以计算5的阶乘:$factorial = 1;for ($i = 5; $i > 0; $i--) {$factorial *= $i;}echo $factorial;这段代码中,我们使用for循环从5开始,递减到1,每次将$i 乘以$factorial,最终得到5的阶乘120。
使用递归计算阶乘除了使用循环,我们还可以使用递归来计算阶乘。
递归是一种函数调用自身的技术,它可以使代码更加简洁、清晰、易于理解。
下面是一个使用递归计算阶乘的例子:function factorial($n) {if ($n <= 1) {return 1;} else {return $n * factorial($n - 1);}}echo factorial(5);这段代码中,我们定义了一个名为factorial的函数,它接受一个整数$n作为参数。
如果$n小于等于1,则返回1,否则返回$n乘以factorial($n-1)的结果。
最后,我们调用factorial函数,传入5作为参数,得到5的阶乘120。
使用递归计算阶乘的优点是可以使代码更加简洁、清晰、易于理解。
但是,由于递归需要不断地调用函数本身,因此在计算大数的阶乘时可能会出现栈溢出的问题。
如何使用递归计算阶乘求和?现在,我们来考虑一个稍微复杂一些的问题,如何使用递归计算1到n的阶乘的和?例如,当n=5时,我们需要计算1!+2!+3!+4!+5!=1+2+6+24+120=153。
采用汇编语言实现阶乘运算
汇编语言程序设计报告课程设计题目:采用汇编语言实现阶乘运算学号:********姓名:张子琦院系:测试与光电工程学院专业:测控技术与仪器指导教师:***采用汇编语言实现阶乘运算学生姓名:张子琦班级:10081437指导老师:陈振华摘要:汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。
尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。
因此掌握汇编语言是学好微机原理和接口设计的第一步。
编写计算N!的程序。
数值由键盘输入,结果在屏幕上输出。
[1]关键字:汇编语言 N!键盘输入屏幕输出指导老师签名:Factorial implemented in assembly language Student name :Ziqi Zhang Class:10081437Supervisor:Zhenhua ChenAbstract: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 effi ciency, 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 outputSignature of Supervisor:目录1 背景[2] (1)1.1汇编语言 (1)1.2设计概述 (2)2 功能描述 (2)3 详细设计 (2)3.1原理及设计思路 (2)3.2流程图 (3)3.3源程序代码[1][2] (4)4 运行过程 (8)4.1编译源程序 (8)4.2汇编 (8)4.3连接并生成可执行文件 (9)4.4运行程序 (9)5 心得体会 (10)6 参考文献 (10)7 致谢 (11)1 背景[2]1.1汇编语言汇编语言是直接面向处理器(Processor)的程序设计语言。
阶乘计算求某个数的阶乘
阶乘计算求某个数的阶乘阶乘,又称阶乘函数,是指从1乘到某个正整数n的连乘积。
求某个数的阶乘是数学中常见的运算问题,下面将介绍阶乘的定义、计算方法以及应用。
1. 阶乘的定义阶乘的定义非常简单,即将某个正整数n与之前所有的正整数相乘,表示为n!。
例如,5的阶乘可以表示为5!,计算方法为5 × 4 × 3 × 2 ×1 = 120。
2. 阶乘的计算方法在计算阶乘时,可以使用循环或递归的方式进行计算。
2.1 循环计算法循环计算是一种直接、简单的方法,适用于小规模的阶乘计算。
通过循环从1到n,将每个数与之前的积相乘,最终得到n的阶乘。
下面是一个示例代码:```pythondef factorial(n):result = 1for i in range(1, n+1):result *= ireturn result```2.2 递归计算法递归计算是一种将大问题拆分为小问题的方法。
通过将n的阶乘表示为n乘以(n-1)的阶乘,再递归地计算(n-1)的阶乘,直到计算到1的阶乘为止。
下面是一个示例代码:```pythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)```3. 阶乘的应用阶乘在数学、计算机科学以及其他领域中有广泛的应用。
以下是一些常见的应用场景:3.1 排列组合在排列组合计算中,阶乘用于表示从n个不同元素中取出k个元素进行排列的方式数量。
具体计算公式为:A(n, k) = n! / (n-k)!3.2 概率统计在概率统计中,阶乘用于计算排列和组合的概率。
例如,某个事件发生的可能性就是根据阶乘计算得出的。
3.3 数学运算阶乘在数学运算中经常出现,例如计算组合数、计算二项式系数等。
4. 总结阶乘是数学中的一种常见运算,在计算机科学和其他领域也有广泛的应用。
通过循环和递归两种计算方法,我们可以求得某个数的阶乘。
4行代码计算9999的阶乘
4行代码计算9999的阶乘本文来源于csdn2001年的一个帖子,题目是有谁可以用四行代码求出1000000的阶乘!!!,见/t/20001226/11/52263.html,我在该帖中给出了代码。
但严格的将,这个代码的行数并未控制在4行以内。
这次给出一个只用4行代码计算10000以内的阶乘的完整程序,并给出代码优化(压缩)过程)下面看看这个程序的最初形式1.//第一版,正常的格式2.#define N 10 //计算N的阶乘,最多只能算到99993.long a[8916]={1,0},n,i,c,len;4.int main()5.{6. n=N;7. for ( len=1;n>1; n--)8. {9. for (c=0,i=0; i<len;i++)10. {11. long p= a[i]*n+c;12. a[i]= p % 10000;13. c=p / 10000;14. }15. a[i]= c;16. if (c>0)17. len++;18. }19. printf("%d",a[len-1]);20. for( len--;len>=0;len--)21. printf("%04d",a[len]);22. return 0;23.}代码的首次改进,压缩代码行数1.// 第二版:将打印语句缩写到1行,同时化简计算部分的内循环2.#define N 100 //计算N的阶乘,最多只能算到99993.long a[8916]={1,0},n,i,c,len;4.int main()5.{6. n=N;7. for ( len=1;n>1; n--)8. {9. for (c=0,i=0; i<len;i++)10. {11. a[i]= ( c+= a[i]*n ) % 10000; c/=10000;12. }13. a[i]= c;14. if (c>0)15. len++;16. }17. for( len--,printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]);18.19. return 0;20.}进一步改进1.// 版本3:将外循环的最后2条语句改为一个"?" 语句将2.#define N 10 //计算N的阶乘,最多只能算到99993.long a[8916]={1,0},n,i,c,len;4.int main()5.{6. n=N;7. for ( len=1;n>1; n--)8. {9. for (c=0,i=0; i<len;i++ )10. {11. a[i]= ( c+= a[i]*n ) % 10000; c/=10000;12. }13.14. ((a[i]=c)>0)?len++:0;15. }16. for( len--,printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]);17.18. return 0;19.}再次改进1.// 版本42.// 将内循环中的两条语句变成一条语句,用逗号分隔,去掉{}3.// 将外循环最后一行和外循环for语句第三部分"n--"合并,4.// 进行格式重排,将main函数和变量定义语句放入一行5.// 将将len从1开始改为从0开始6.#include <stdio.h>7.#define N 10 //计算N的阶乘,修改N的定义可计算10000以内任意数的阶乘8.long a[N]={1,0},n,i,c,len; void main() {9.for ( n=N,len=0;n>1;((a[i]=c)>0) ? (len++,n--) : n--)10. for (c=0,i=0; i<=len;i++ ) a[i]= ( c+= a[i]*n ) % 10000, c/=10000;11.for( printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]); }版本5,进一步优化,不算include, #define 及回车换行符,只有170个byte. 主要改进有:1. 删除多余的空格2. "a[8916]={1,0}" 改为"a[N]={1}",节省5个字符3. 变量赋值n=N 放到变量声明语句,减少1个字符4. len 改为单变量m, 减少了10个以上的字符5. 全局变量自动初始化为0,len=0,这句去掉6. "((a[i]=c)>0)?(m++,n--):n--" 改为"(a[i]=c)>0?m++:0,n--",节省了6个字符7. 最后一个for 语句中,由"printf("%d",a[m--]);m>=0;m--" 调整为"printf("%d",a[m]);--m>=0;", 节省了4个字符8. 虽然说long 改为int 可节约一个字符,但这样的话,在16为编译器的运行结果将出错,失去了通用性1.//版本52.#include <stdio.h>3.#define N 10 //计算N的阶乘,修改N的定义可计算10000以内任意数的阶乘4.long a[N]={1},n=N,i,c,m;void main(){5.for(;n>1;(a[i]=c)>0?m++:0,n--)6.for(c=0,i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10000,c/=10000;7.for(printf("%d",a[m]);--m>=0;)printf("%04d",a[m]);}版本6,再次改进,又减少11个字符,扣除#include 和#define语句,共159个字节1.#include <stdio.h>2.#define N 10 //计算N的阶乘,修改N的定义可计算10000以内任意数的阶乘3.int a[N]={1},n=N,i,c,m;void main(){4.for(;n;(a[i]=c)>0?m++:0,n--)5.for(c=i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10000,c/=10000;6.for(c=m+1;c;)printf(c>m?"%d":"%04d",a[--c]);}版本7:采用10进制,在主流编译器可以实现1-200000的阶乘,扣除#include 和#define 语句,共153个字节,但是速度较慢。
python 计算阶乘
python 计算阶乘以Python计算阶乘为标题,本文将介绍如何使用Python编程语言计算阶乘。
阶乘是一个常见的数学概念,表示一个正整数n与小于等于它的所有正整数的乘积。
阶乘通常用符号“!”表示,如n!。
在Python中,计算阶乘可以通过循环或递归的方式实现。
下面将介绍两种计算阶乘的方法,并给出相应的代码示例。
方法一:使用循环计算阶乘通过循环计算阶乘是一种简单而有效的方法。
我们可以从1开始,依次将每个正整数相乘,直到n。
下面是通过循环计算阶乘的Python代码示例:```pythondef factorial(n):result = 1for i in range(1, n+1):result *= ireturn result# 测试代码n = 5print("阶乘结果:", factorial(n))```在上述代码中,我们定义了一个名为factorial的函数,该函数接受一个整数n作为参数,并返回n的阶乘。
通过for循环,我们将每个小于等于n的正整数依次相乘,并将结果保存在result变量中,最终返回result的值。
方法二:使用递归计算阶乘递归是一种在函数定义中使用函数自身的方法。
通过递归计算阶乘可以更直观地表达阶乘的定义。
下面是使用递归计算阶乘的Python 代码示例:```pythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)# 测试代码n = 5print("阶乘结果:", factorial(n))```在上述代码中,我们定义了一个名为factorial的函数,该函数通过递归方式计算阶乘。
当n等于0或1时,阶乘的值为1;否则,阶乘的值为n乘以n-1的阶乘。
通过递归调用函数自身,我们可以一直计算到n等于0或1,从而得到阶乘的结果。
通过上述两种方法,我们可以在Python中计算任意正整数的阶乘。
递归调用求n的阶乘
递归调用求n的阶乘1. 什么是阶乘?在数学中,阶乘是一个正整数的连乘积,表示为n!。
例如,5的阶乘表示为5!,计算方式为5 × 4 × 3 × 2 × 1 = 120。
2. 阶乘的递归定义阶乘可以通过递归的方式来定义和计算。
递归是一种解决问题的方法,其中函数调用自身以解决更小规模的子问题。
对于n的阶乘,可以通过以下递归定义来计算:•当n等于0时,0的阶乘为1。
•当n大于0时,n的阶乘等于n乘以(n-1)的阶乘。
这个定义可以用一个递归函数来实现。
3. 使用递归函数求解阶乘下面是使用递归函数求解n的阶乘的示例代码(使用Python语言):def factorial(n):if n == 0:return 1else:return n * factorial(n-1)在这个代码中,我们定义了一个名为factorial的函数,它接受一个整数参数n。
该函数使用了条件语句来处理两种情况:当n等于0时返回1(作为结束条件),否则返回n乘以factorial(n-1)的结果。
4. 递归调用的过程为了更好地理解递归调用求解阶乘的过程,我们可以通过一个具体的例子来演示。
假设我们要计算5的阶乘:5! = 5 × 4 × 3 × 2 × 1。
首先,我们调用factorial(5)。
由于5不等于0,所以函数返回5 * factorial(4)。
然后,我们调用factorial(4)。
由于4不等于0,所以函数返回4 * factorial(3)。
接着,我们调用factorial(3)。
由于3不等于0,所以函数返回3 * factorial(2)。
然后,我们调用factorial(2)。
由于2不等于0,所以函数返回2 * factorial(1)。
接着,我们调用factorial(1)。
由于1不等于0,所以函数返回1 * factorial(0)。
python计算阶乘 并取模快速算法
python计算阶乘并取模快速算法Python是一种功能强大的编程语言,拥有丰富的库和模块,可以用于解决各种问题。
在计算机科学中,阶乘是一个常见的数学运算,用于计算一个正整数的阶乘。
阶乘的定义是从1到该正整数的连乘积,即n! = 1 × 2 × 3 × ... × (n-1) × n。
在计算阶乘时,我们可能会遇到一些问题,特别是当我们需要计算大数的阶乘时。
传统的计算方法可能会导致计算速度慢、内存消耗大的问题。
为了解决这个问题,可以使用取模快速算法。
取模快速算法是一种用于计算大数取模的高效算法。
它基于以下原理:对于任意的正整数a、b和m,有(a * b) % m = ((a % m) * (b % m)) % m。
这个原理可以推广到计算阶乘的过程中。
我们可以使用Python编写一个函数来计算阶乘并使用取模快速算法。
下面是一个示例代码:```pythondef factorial_mod(n, m):result = 1for i in range(1, n+1):result = (result * i) % mreturn result```在这个函数中,我们使用一个循环来计算从1到n的连乘积,并在每次乘法操作后取模m。
这样可以避免中间结果变得过大,从而提高计算效率。
要使用这个函数计算阶乘,只需要传入一个正整数n和一个取模数m即可。
函数将返回n的阶乘对m取模的结果。
下面是一个示例演示如何使用这个函数:```pythonn = 10m = 1000000007result = factorial_mod(n, m)print("The factorial of", n, "mod", m, "is:", result)```在这个示例中,我们计算了10的阶乘并对1000000007取模的结果,并将结果打印出来。
递归求n的阶乘
递归求n的阶乘阶乘是数学中一个很重要的概念,也是经常使用的一个技术,它的出现和广泛应用,在许多领域都有重要的作用,比如在概率论、计算机科学、统计学等领域都有应用。
因此,有效的求解阶乘的方法也受到了许多研究者的关注。
关于阶乘的概念,一般来说就是在一堆数字中,取出从1到n的数字,并且将这n个数字全都相乘之后得到的结果。
在实际使用中,阶乘可以用来代替数字序列中所有数字的乘积,这为大家求解手上的一些问题提供了很大的方便。
要正确地求出一个数字n的阶乘,有几种方法可以使用,其中一种最常用的方法就是使用递归求解。
相比较传统的方法,使用递归求解n的阶乘,速度会更快捷,而且可以使用更少的计算量,得到更接近实际的结果。
关于使用递归求解n的阶乘,首先要确定跳出条件,即求解到哪一步就结束,一般来说当n为1或0时,就可以认为求解结束,这可以和利用递归求解斐波那契数列时相同,即当n为1或者0时,递归也会停止,而结果将会是1。
然后拟定求解的步骤,此时可以考虑利用定义来拟定求解步骤,即定义n的阶乘为n * (n - 1) * (n - 2) * ...* 1,可以将求解的步骤定义为,n的阶乘 = n * (n-1)的阶乘,可以看出,在求解n的阶乘时,依据这个定义,求解的步骤就是:将n的阶乘分解为 n * (n-1) 的阶乘,并且递归地求解n-1的阶乘,这时需要加入一个跳出条件,即当n=1时,直接将n的阶乘定义为1。
因此,使用递归求解n的阶乘的过程其实是一个指数增长的过程,即在求解n的阶乘时,要求解n-1的阶乘,当求解到n-1的阶乘时,又要求解n-2的阶乘,以此类推,考虑到最后会到达1,即满足跳出条件,因此会最终得到n的阶乘的结果。
只是因为使用了递归求解,从而让过程变得简洁明了,并且大大减少了计算量,极大地提高了效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本程序作者cabbage功能:计算1亿以内数的阶乘E-mail:1225673051@;**********************求阶乘程序,十进制输入一个数,十进制输出其结果*********************STROUT MACRO ;宏,DOS功能调用,设置字符串输出入口参数MOV AH,09HINT 21HENDMCHAR_IN MACRO ;宏,DOS功能调用,设置字符输入入口参数MOV AH,01HINT 21HENDMDATAS SEGMENT PUBLICDATA1 DB 10H DUP(0)LEN1 DW ?LEN2 DW ?CONST1 DW 30CONST2 DW 40INDEX DB 10H DUP(0)STR0 DB '********************FACTORIAL**********************$'STR1 DB 0AH,0DH,'Please input the num:$'STR2 DB 0AH,0DH,'Error!$'STR3 DB 0AH,0DH,'The result is:$'STR4 DB 0AH,0DH,'****************************************************$'STR5 DB 0AH,0DH,'Thank you for using!$'DATA3 DB 0FF24H DUP(0)DATAS ENDSDATAS1 SEGMENT PUBLICDB 0FFFFH DUP(0)DATAS1 ENDSDATAS2 SEGMENT PUBLICDATA2 DB 0FFFFH DUP(0)DATAS2 ENDSDATAS3 SEGMENT PUBLICDB 0FFFFH DUP(0)DATAS3 ENDSSTACKS SEGMENT STACKDW 2000H DUP(?)TOP LABEL WORDSTACKS ENDSCODES1 SEGMENTASSUME CS:CODES1,DS:DATAS,SS:STACKS,ES:DATAS2START:MOV AX,DATASMOV DS,AXMOV AX,STACKSMOV SS,AXMOV AX,DATAS2MOV ES,AXMOV SP,OFFSET TOPMOV LEN1,OFFSET DATA2MOV LEN2,OFFSET DATA3MOV DX,OFFSET STR0STROUTs1:CALL ZERO ;清零DATA1,DATA2,DATA3,INDEX,为保证运行结果不受前次影响XOR AX,AXXOR BX,BXXOR CX,CXXOR DX,DX ;清零AX,BX,CX,DX等寄存器,为保证运行结果不受前次影响MOV DX,OFFSET STR1STROUTXOR SI,SIdo1:CHAR_INCMP AL,0DHJZ d1CMP AL,'0'JB errorCMP AL,'9'JA errorSUB AL,'0'MOV DS:BYTE PTR [SI],AL ;输入原始数据,按位输入,高位先输INC SIJMP do1d1:CMP SI,0JZ exitMOV CX,SIXOR DI,DIdo2:MOV AL,DS:BYTE PTR [SI-1]MOV ES:BYTE PTR DATA2[DI],AL ;先给DATA2中赋值,使其等于输入的数据INC DIDEC SILOOP do2MOV CX,DIXOR SI,SIXOR DI,DIdo3:MOV AL,ES:BYTE PTR DATA2[DI]MOV DS:BYTE PTR [SI],ALINC DI ;再将DATA1中的数据实现,高位存放在地址较大的存储单元INC SILOOP do3s2:XOR AX,AXCALL FAR PTR FAC ;调用阶乘计算函数CMP SI,1 ;当还没有计算到1时,再次进入阶乘函数JNZ s2MOV AL,DS:BYTE PTR [SI-1]CMP AL,1JZ s3JMP s2s3:CALL FAR PTR RESULT ;输出结果JMP s1error:MOV DX,OFFSET STR2STROUTJMP s1exit:MOV DX,OFFSET STR5STROUTMOV AH,4CHINT 21HCODES1 ENDS;*********************************************************CODES2 SEGMENTASSUME CS:CODES2,DS:DATAS,SS:STACKS,ES:DATAS2;递归子过程,计算阶乘,没当递归次数大于等于5000时,返回再次进入,降低栈对递归的限制FAC PROC FARINC AXPUSH AXdo6:MOV AL,ES:BYTE PTR DATA2[DI-1]DEC DICMP AL,0JZ do6INC DICMP DI,CONST2JB s4CALL FAR PTR DZEROs4:CMP SI,1JNZ s5MOV AL,DS:BYTE PTR [SI-1]CMP AL,1JZ s9JMP s6s5:MOV CX,SIDEC CXXOR BP,BPMOV AL,DS:BYTE PTR [BP]SUB AL,1PUSHFAASMOV DS:BYTE PTR [BP],ALdo4:INC BPMOV AL,DS:BYTE PTR [BP]POPFSBB AL,0PUSHFAASMOV DS:BYTE PTR [BP],ALLOOP do4POPFMOV AL,DS:BYTE PTR [SI-1]CMP AL,0JNZ s7DEC SIJMP s7s6:MOV AL,DS:BYTE PTR [SI-1]SUB AL,1MOV DS:BYTE PTR [SI-1],ALs7:CALL FAR PTR MULTPOP AXCMP AX,1388HJZ s8CALL FAR PTR FACs8:RETs9:POP AXRETFAC ENDPCODES2 ENDS;*********************************************************;乘法运算函数,用于多位非压缩码BCD数(DATA1)与多位非压缩码BCD数(DATA2)的乘法运算;,并将结果存放在DATA2中。
将多位数乘法运算转变成多位数加法来运行CODES3 SEGMENTASSUME CS:CODES3,DS:DATAS,SS:STACKS,ES:DATAS2MULT PROC FARPUSH AXPUSH BXPUSH CXPUSH DXPUSH BPPUSH SIPUSH DIPOP DXPOP CXXOR DI,DIXOR BP,BPPUSH CXs10:POP CXPUSH CXPUSH BPXOR SI,SIs11:MOV BH,0MOV AH,0MOV BL,DS:BYTE PTR [SI]MOV AL,ES:BYTE PTR DATA2[DI]INC SIMUL BLAAM ;BCD调整指令PUSH BPMOV BL,AHXOR AH,AHADD AL,DS:BYTE PTR DATA3[BP]AAA ;BCD调整指令ADD BL,AH ;可能产生进位MOV DS:BYTE PTR DATA3[BP],ALINC BPMOV AL,BLs12:XOR AH,AHADD AL,DS:BYTE PTR DATA3[BP]AAA ;BCD调整指令MOV DS:BYTE PTR DATA3[BP],ALINC BPMOV AL,AHCMP AL,0JNZ s12POP BPINC BPCMP SI,CXJNZ s11INC DIMOV CX,BPPOP BPADD BP,1CMP DI,DXJNZ s10XOR BP,BPXOR DI,DIdo5:MOV AL,DS:BYTE PTR DA TA3[BP]MOV ES:BYTE PTR DATA2[DI],ALMOV DS:BYTE PTR DATA3[BP],0INC DIINC BPLOOP do5POP SIPOP BPPOP DXPOP CXPOP BXPOP AXRETMULT ENDPCODES3 ENDS;*********************************************************;结果输出函数,将以非压缩BCD码存放的结果转换成科学计数法,并以字符输出CODES4 SEGMENTASSUME CS:CODES4,DS:DATAS,SS:STACKS,ES:DATAS2RESULT PROC FARPUSH DXPUSH DIMOV CX,DIPUSH CXXOR SI,SIXOR BP,BPdo7:MOV AL,ES:BYTE PTR DATA2[DI-1]ADD AL,30HMOV DS:BYTE PTR DATA3[SI],AL ;将DATA2中存放的数以逆序传到DATA3中,并转换成ASCII码DEC DIINC SILOOP do7MOV DS:BYTE PTR DATA3[SI],'$'MOV DX,OFFSET STR3CMP SI,20JA s13MOV DX,LEN2STROUTJMP s14s13:MOV DS:BYTE PTR DATA3[11],'$'MOV DL,DS:BYTE PTR DATA3[BX]MOV AH,02HINT 21HMOV DL,'.'MOV AH,02HINT 21HMOV DX,LEN2INC DX ;第一位已经输出了STROUTMOV DL,'e'MOV AH,02HINT 21HMOV DL,'+'MOV AH,02HINT 21HSUB SI,1MOV CX,SI ;存放现有数据的长度CALL FAR PTR ADDSMOV BX,OFFSET INDEXMOV CX,10HMOV SI,CXdo8:MOV AL,DS:BYTE PTR [BX][SI-1]DEC CXDEC SICMP AL,0JZ do8INC CXINC SIdo9:MOV DL,DS:BYTE PTR [BX][SI-1]ADD DL,30HMOV AH,02HDEC SIINT 21HLOOP do9s14:MOV DX,OFFSET STR4STROUTPOP CXPOP DIPOP DXRETRESULT ENDPCODES4 ENDS;*********************************************************;清零DA TA1,DA TA2,DATA3,INDEX,为保证运行结果不受前次影响CODES5 SEGMENTASSUME CS:CODES5,DS:DATAS,SS:STACKS,ES:DATAS2ZERO PROC FARPUSH DXMOV CX,10HXOR SI,SIdo10:MOV DS:BYTE PTR [SI],0MOV DS:BYTE PTR INDEX[SI],0INC SILOOP do10MOV CX,0FF00HXOR SI,SIdo11:MOV ES:BYTE PTR DATA2[SI],0MOV DS:BYTE PTR DATA3[SI],0INC SILOOP do11POP DXRETZERO ENDPCODES5 ENDS;*********************************************************;在运行的过程中,当DATA2中的结果位数很大时,选择性保留固定长度的高位,将舍弃的位数加到指数INDEX上CODES6 SEGMENTASSUME CS:CODES6,DS:DATAS,SS:STACKS,ES:DATAS2DZERO PROC FARPUSH DXPUSH CXPUSH BXPUSH AXPUSH SIMOV CX,DISUB CX,CONST1MOV DI,CXPUSH DIPUSH CXCALL FAR PTR ADDSPOP CXPOP DIXOR SI,SIdo12:MOV ES:BYTE PTR DATA2[SI],0INC SILOOP do12MOV CX,CONST1XOR SI,SIdo13:MOV AL,ES:BYTE PTR DATA2[DI]MOV ES:BYTE PTR DATA2[SI],ALMOV ES:BYTE PTR DATA2[DI],0INC SIINC DILOOP do13MOV DI,CONST1POP SIPOP AXPOP BXPOP CXPOP DXRETDZERO ENDPCODES6 ENDS;*********************************************************;结果的幂的控制函数,CX为传递参数,存放的是在DZERO去零数CODES7 SEGMENTASSUME CS:CODES7,DS:DATAS,SS:STACKS,ES:DATAS2ADDS PROC FARPUSH BXPUSH AXPUSH BPPUSH SI;CX已经在被调用前赋值do14:XOR AH,AHXOR SI,SIMOV AL,DS:BYTE PTR INDEX[SI]ADD AL,1AAA ;BCD调整指令MOV BL,AH ;可能产生进位MOV DS:BYTE PTR INDEX[SI],ALINC SIMOV AL,BLCMP AL,0JZ s17s16:XOR AH,AHADD AL,DS:BYTE PTR INDEX[SI]AAA ;BCD调整指令MOV DS:BYTE PTR INDEX[SI],ALINC SIMOV AL,AHCMP AL,0JNZ s16s17:LOOP do14POP SIPOP BPPOP AXPOP BXRETADDS ENDPCODES7 ENDSEND START。