设计一个过程(函数或子程序):计算n!=1×2×3×…×n.用C语言主调函数过程调用这个过程并完成下列任务:

设计一个过程(函数或子程序):计算n!=1×2×3×…×n.用C语言主调函数过程调用这个过程并完成下列任务:,第1张

这个问题直接用变量来算是错误的,整形或者长整形没有这么大,26的阶乘有27位数字,用double虽然能存下,但是损失了精度,后面的数字是不准确的,double虽然上限是10的308次方,但是有效地数字位数只有14-15位的样子,也就是用类似科学计数法来保存的,数字不准确。这个只能用数组自己一位一位地算。下面是例子代码。

#include <stdioh>

char CalcFact(int n)

{

int a[100]; //确保保存最终运算结果的数组足够大,26的阶乘有27位,这里至少要比最大结果再多1位

longint digit = 1; //结果的位数

longint temp; //阶乘的任一元素与临时结果的某位的乘积结果

longint i,j,carry; //i:1~n的某一阶乘元素;carry:进位

a[0] = 1; //将结果先初始化为1

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

{ //开始阶乘,阶乘元素从2开始依次"登场"

//按最基本的乘法运算思想来考虑,将阶乘元素i与临时结果的每位a[j-1]相乘

for( j = 0, carry = 0; j < digit; j++)

{

temp = i a[j] + carry; //相应阶乘中的一项i与当前所得临时结果的从低到高各位a[j-1]依次相乘(加上进位)

a[j] = temp % 10; //更新临时结果的位上信息

carry = temp / 10; //更新相乘后的进位

}

while(carry) //如果有进位

{

++digit; //新加一位,添加信息。位数增1

a[digit-1] = carry % 10; //将进位放在新加的结果位上

carry = carry/10; //看还能不能进位

}

char myFact[digit+1];

temp=0;

for(j = digit; j >=1;j--)

{

myFact[temp]=a[j]+48; //+48把数字变成字符,‘0’=48,以此类推

temp++;

}

myFact[temp]='\0';

return myFact;

}

void main()

{

printf (“26!=%s”, CalcFact(26));

printf (“20!=%s”, CalcFact(20));

}

从别人回答中摘的:

常见的CPU的CALL指令(“调用”指令)的功能,就是以下两点:

(1)将下一条指令的所在地址(即当时程序计数器PC的内容)入栈,

(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。

而子程序结尾处通常都要编写一条RET指令(“返回”指令),RET指令的功能就是一条:

从栈中取出一条数据送入PC。

从上面叙述可以看出,正常情况下,RET指令从栈中取出的一条数据,也就是当初被CALL指令所入栈的下一条指令的所在地址。

因此,RET指令后,CPU的下一条指令就回去执行当初的CALL指令的下一条了。

CALL L1

调用子程序即过程调用,为了保护现场,会压栈保存断点,段内调用,说明L1的属性为NEAR,只需保存IP(pc值),SP=SP-2,但是如果是段间调用则需要保存CS和IP

那么SP=SP-4不管怎么样,在执行完RET后,要恢复现场,即d出断点,SP=SP+2

(段间调用SP=SP+4)

也就是说过程调用前后,SP总体看不会变,但是其堆栈发生了一系列变化。

SP数值没变!

在联赛初赛卷中,填空题的内容通常有1、变量方面的填空定义变量的数据类型;设定变量的初值;对变量的赋值;根据变量的辖域确定其是全局变量还是某个子程序的局部变量。2、循环方面的填空 定义循环变量;设定循环变量的初值和终值;在循环体中怎样引用循环变量;如何保证循环体无论在一般情况下还是在特殊情况(第一次循环或最后一次循环)下都是对的。3、分支转移方面的填空定义布尔表达式;根据布尔值确定程序的走向;4、主程序和子程序关系方面的填空 子程序说明中的形式参数表设定了哪些参数,其中哪些是值参,哪些是变量参数;主程序什么时候调用子程序;调用的实际参数表怎样和形式参数表“匹配”。 5、输入输出方面的填空按照变量的定义和输入输出格式的要求,哪些变量的初值应该通过输入得到,哪些变量的计算结果应该输出。如果说程序所要解决的问题是主目标,则计算模型明确了到达这个主目标的方向。程序样例给出了大致的路径方案。“填空”就是要求你在这张路径图上补全“空格”所代表的“边”,使得该程序能够达到预期目的。6、核心算法的理解完善程序题解题步骤:1、仔细阅读文字解释,理解题意和提供的解题思路2、根据问题的求解要求,了解输入、输出内容和问题处理方法3、先阅读主程序,了解输出变量和输出要求以及主程序中需要调用的过程或函数是哪些。4、阅读过程或函数,了解其完成的功能5、填空方法:可以从程序的两端进行:(1)从程序(或主程序)最后输出变量、结果要求,可以完成部分填空,同时可以反推所涉及到的或相关的变量、表达式、语句的填写;(2)从程序(或主程序)初始化程序段开始填写,完成初始化程序的填写任务;(3)观察整个程序中主要变量、控制变量的变化,并能根据程序结构、模块划分出相应功能;(4)根据算法提示完成部分填空。6、根据主程序参数与子程序参数传递关系,填写子程序的变量,根据子程序需要完成的功能,完成子程序填空7、填写完大多数空白后,再将程序整个阅读一遍,完成全部填空。8、将填写后的程序阅读一遍,检查其能否完成问题的求解,直到完成任务。

读程序解题步骤做阅读程序题,首先要想方设法弄清楚程序的功能,每个题目总有一点“写作目的”。抓住了它,不仅答案变得容易了,而且对自己的结果也比较有信心。

1、从总体上通读程序,大致把握程序的目的和算法。

2、猜测变量的作用,跟踪主要变量值的变化(列表),找出规律。

3、将程序分段,理清每一小段程序的作用和目的。

4、看清输入,按照输出格式,写出结果。

5、带着到的结果回到程序进行检查。

几种方法a 直接模拟

b 先模拟几次循环后找规律

c 直接看程序了解算法功能

d 了解程序本质后换一个方法解决

e 有时不知道算法可以通过观察猜出来

以上就是关于设计一个过程(函数或子程序):计算n!=1×2×3×…×n.用C语言主调函数过程调用这个过程并完成下列任务:全部的内容,包括:设计一个过程(函数或子程序):计算n!=1×2×3×…×n.用C语言主调函数过程调用这个过程并完成下列任务:、汇编语言程序设计中,子程序设计时的现场保护和恢复是如何实现的举例说明。、NOIP做写结果和程序填空的技巧等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10632090.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存