解题思路: 首先,题目中已经给了我们算法的大概思想,高精度计算,用数组实现。
首先我们要知道数组每一个位置存该大数的一个数位 如果用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 <stdio.h> #include <stdlib.h> 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分
10 人评分
#include<stdio.h> int a[2568],weishu=1; void funtion(int i); int main(void) { int n,i; scanf("%d",&n); a[0]=1; for(i=2;i<=n;i++) funtion(i); for(i=weishu-1;i>=0;i--) printf("%d",a[i]); } void funtion(int i) { int j; for(j=0;j<weishu;j++) a[j]*=i; for(j=0;j<weishu;j++) { if(a[j]/10&&j==weishu-1) weishu++; a[j+1]+=a[j]/10; a[j]=a[j]%10; } }
5000位够吗,感觉太少了 起码得10w吧
C二级辅导-计负均正 (C语言代码)浏览:698 |
C语言训练-排序问题<2> (C++代码)浏览:936 |
C语言训练-最大数问题 (C语言代码)浏览:648 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:568 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:503 |
用筛法求之N内的素数。 (C语言代码)浏览:890 |
Tom数 (C语言代码)浏览:758 |
小九九 (C语言描述,不看要求真坑爹)浏览:1006 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:612 |
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:636 |
uq_59601343180 2022-12-25 09:43:50 |
厉害
uq_59601343180 2022-12-25 09:44:26 |
我滴神,666