C语言作业用函数编程计算阶乘,[蓝桥杯][基础练习VIP]阶乘计算 (C语言代码)...

解题思路: 首先,题目中已经给了我们算法的大概思想,高精度计算,用数组实现。

首先我们要知道数组每一个位置存该大数的一个数位 如果用char类型的数组,可以减小内存开销,但是须要处理字符与数字变换问题,由于本人比较懒,所以直接用了int类型的数组

处理方法就按题目中给的方法来:

第一步:开辟好数组空间,这里我使用全局变量的方式,因为全局变量允许申请的连续空间要比局部变量长(原因我也不知道,也是偶然一次编码发现的),其次,一次申请,全局使用,节省空间。为了标记数组哪些位置被使用,哪些位置未使用,我采用利用-1标记未使用的方法。

第二步:编写主函数(main) 把预处理数据,函数调用,数据输出都先写好,然后我们的工作就直接落在数据处理函数上面了,强烈建议这样,千万不要养成什么东西都在main里面写的坏习惯。

第三步:编写数据处理函数,也就是我们要实现的算法,这里就按题目中的算法一步一步来,用数组每一位去乘以阶乘变量,然后看一下是否大于等于10 如果是则处理进位(单独保存进位值,并且把当前位置数值对十取余数)

第四步:避免时间太长,建议第三部函数返回数字在数组中的长度,可避免一次循环搜索。

注意事项:

这里提一点 :千万注意一下,在你处理完一次当前计算时,是否还需要向最高位进位,也就是像 15X9 = 135 这种情况,当5x9 进位4 然后1x9 加上进位4 以后还需要向前继续进位!!而且题目要求的最大值是1000 可能还是不是进一位哦!!

而且为了避免一次进位对下一次的影响,我们需要在进位之后将进位变量置0

再有一点,不论是阶乘计算还是什么,只要是有乘法的计算,应该避免出现0 ,除非题目要求你那样做。

参考代码:

变量定义: 全局:num[5000] 用来存放计算结果

jcjs函数参数: num[] 保存结果的数组 。n: 要计算的n

jcjs: len :有效长度,也就是计算结果的数组长度。 i:阶乘从1-n的循环变量。 p结果数组的下标指针。 jw:进位值

main: n 要计算n的阶乘 。len结果数组的有效长度#include 

#include 

int num[5000];

int jcjs(int num[],int n){

num[0]=1;

int len=1;

int i;

for(i=1;i<=n;++i){

len=0;

int p = 0;

int jw=0;

while(num[p]!=-1){

num[p]*=i;

num[p]+=jw;

jw=0;  //进位加完置零

if(num[p]>=10){

jw=num[p]/10;

num[p]%=10;

}

p++;

len++;

}

if(jw!=0){

while(jw){ //进位值不一定是1位 要循环处理

num[p++]=jw%10;

jw/=10;

len++;

}

}

}

return len-1;

}

int main(int argc, char *argv[]) {

int n;

while(scanf("%d",&n)!=EOF){

memset(num,-1,sizeof(num));

int len = jcjs(num,n);

for(len;len >=0;--len){

printf("%d",num[len]);

}

printf("\n");

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值