1 #include "stdio.h" 2 #include "String.h" 3 #define MAX 10000 4 int f[MAX]; 5 void Arr_reset(int a[],int m,int n) 6 { 7 int i; 8 for(i=m;i<=m;i++) 9 { 10 a[i]=0; 11 } 12 } 13 int main(void) 14 { 15 int i,j,n; 16 printf("Enter n:"); 17 scanf("%d",&n); 18 Arr_reset(f,0,(sizeof(f)/sizeof(int)));//对数组进行初始化 19 f[0]=1; 20 for(i=2;i<=n;i++) 21 { 22 //乘以 i 23 int c=0; 24 for(j=0;j<MAX;j++)//最不易理解的 25 { 26 int s=f[j]*i+c; 27 f[j]=s%10; 28 c=s/10; 29 //算出的 s 是单位数时,会连续覆盖 f[0] 30 //否则一个多位数会倒过来存储,如 123,f[0]存 3,f[1]存 2,f[3]存 1 31 //因此上式先求余,在求模 32 } 33 } 34 for(j=MAX-1;j>=0;j--) 35 if(f[j]) 36 break;//忽略前导 0 37 for(i=j;i>=0;i--) 38 printf("%d",f[i]); 39 printf(" "); 40 return 0; 41 }
#include<iostream> using namespace std; int main() { int a[10000]; int n; cout<<"请输入n 计算n的阶乘"<<endl; while(cin>>n&&n>=0) { a[0]=1; int temp=0; int digit=1; for(int i=2;i<=n;i++)//该for循环对于大于2的阶乘才奏效。 { int num=0; for(int j=0;j<digit;j++) { temp=a[j]*i+num; a[j]=temp%10; num=temp/10; } while(num) { a[digit]=num%10;//越前存储比如f[0]存4不动,f[1]存2。 num/=10; digit++; } } for(int i=digit-1;i>=0;i--)//反转输出,先输出f[1]为2,再输出f[0]为4。 { cout<<a[i]; } cout<<endl; } return 0; }
不懂 没注释 存疑