解题思路:
大数据阶乘,我们用数组存储结果,这题用长度为5660的数组 jc[5660] 刚好够存1977的阶乘;
1:定义变量weishu代表阶乘的结果所占的位数;
2:把整个数组(jc[])全赋值为0,再把0号元素(jc[0])置1,代表此时阶乘的值为1!,同时,weishu=1;
3:让数组依次乘i=2,3,4........1977 ,依次得到2!, 3!,4!.........1977!
具体乘法:
和我们数学乘法竖式一样的思路
让阶乘中每一位(0~weishu-1)都乘i,与我们手算不同的是,这里不先不进位,我们手算是乘一个进位一次;
乘完后,开始进位,
jc[j+1]+=jc[j]/10; jc[j]%=10;
(我们这里是把个位数存在0号位置,所以进位向后面进)
在进位的过程中,要更新weishu的值,因为在进位后阶乘结果位数改变;
if(jc[j]/10&&(j==weishu-1)) 这个代码的意思就是,阶乘结果的最高(j==weishu-1代表最高位)位有进位 weishu++; 则,阶乘结果位数加一位
进位结束后,整个数组jc[]里面有效位就是i的阶乘了,接着乘以i+1,重复上面过程就得到了i+1的阶乘..最后直1977!
注意事项:
0号元素对应为阶乘结果的个位数,输出结果时,倒着输出;
参考代码:
#include <stdio.h> int jc[5660] = { 0 }; int weishu = 1; void function( int i ); /*-------------------------------------------------------*/ int main() { jc[0] = 1; for ( int i = 2; i <= 1977; i++ ) function( i ); for ( int i = weishu - 1; i >= 0; i-- ) printf( "%d", jc[i] ); return(0); } /*-------------------------------------------------------*/ void function( int i ) { int jinwei; for ( int j = 0; j < weishu; j++ ) jc[j] *= i; for ( int j = 0; j < weishu; j++ ) { if ( jc[j] / 10 && (j == weishu - 1) ) weishu++; jc[j + 1] += jc[j] / 10; jc[j] %= 10; } }
别忘点赞喏-.-
0.0分
58 人评分
#include<stdio.h> int main() { int a[6000],i,x,y,n=0; a[0]=1;x=1; for(i=1;i<=1977;i++) { for(y=0;y<=x;y++) { a[y]*=i;a[y]+=n;n=0; if(a[x-1]>=10) x++; if(a[y]>=10) { n=a[y]/10; a[y]%=10; } } } for(i=x-1;i>=0;i--) { printf("%d",a[i]); } }
#include<stdio.h> void mul(int n,int *num) { for(int i=0;num[i]!=-1;i++) { num[i]*=n; } for(int i=0;num[i]!=-1;i++) { if(num[i]>=10) { if(num[i+1]==-1) { num[i+1]=0; } num[i+1]+=num[i]/10; num[i]%=10; } } } int main() { int num[6000]={1}; for(int i=1;i<6000;i++) { num[i]=-1; } for(int i=1;i<=1977;i++) { mul(i,num); } for(int i=6000-1;i>=0;i--) { if(num[i]!=-1) { printf("%d",num[i]);
为什么我的就不行: #include <stdio.h> #include <stdlib.h> int jc[5660]={0}; int weishu=1; void function (int key); int main(){ jc[0]=1; //初始化 for(int i=2;i<=1997;i++){ function(i); } for(int j=weishu-1;j>=0;j--){ printf("%d",jc[j]); } return 0; } void function(int key){ for(int i=0;i<weishu;i++){ jc[i]*=key; } for(int i=0;i<weishu;i++){ if(jc[i]/10&&(i==weishu-1) ){ weishu++; } jc[i+1]+=jc[i]/10; jc[i]%=10; } }
wind 2024-01-31 14:19:01 |
jc[i]后面超过100
第22行好像没什么用??
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:787 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:717 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1020 |
C语言程序设计教程(第三版)课后习题6.5 (C++代码)浏览:487 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:673 |
【蟠桃记】 (C语言代码)浏览:1084 |
IP判断 (C语言描述,蓝桥杯)浏览:1118 |
关于C语言变量位置的问题浏览:294 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:585 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:676 |
TheMagician 2024-01-31 20:03:26 |
这是我自己根据思路做的,x表示位数,i和y是两个循环,n是一位数*i大于10时溢出的值;