N!
N!
| Time Limit: 5000MS | Memory Limit: 65535KB |
| Submissions: 96 | Accepted: 26 |
Sample Input
1 2 3
Sample Output
1 2 6
解法一:
//用大整数想乘的方法 # include<iostream> # include<cstring> using namespace std; int str[100000]; int main() { int num,flag=0; int i,c,k=0,j; while(cin>>num) { memset(str,0,sizeof(str)); k=0; flag=0; str[0]=1; for(c=1;c<=num;c++) { int m=k; k=0; for(k=0;k<m;k++)//先存每位的值 str[k]*=c; for(j=0;j<k;j++)//进位 { if(str[j]>9)str[j+1]+=str[j]/10; str[j]%=10; } while(str[k]!=0)//超出末位再进 { if(str[k]>9)str[k+1]+=str[k]/10; str[k]%=10; k++; } } for(i=k;i>=0;i--) { if(flag==0) { if(str[i]!=0)//非零开始 { cout<<str[i]; flag=1; } } else cout<<str[i]; } cout<<endl; } return 0; }
解法二:
//网上说了一种“万进制”,太妙了!时间、空间都省了,我也写了写 # include<iostream>//应该用C更好些吧 # include<cstring> # include<iomanip> using namespace std; int str[10000]; int solve(int n) { int w=1,sign,i,j,leap; str[0]=1; for(i=1;i<=n;i++) { sign=0; for(j=0;j<w;j++) { leap=str[j]; str[j]=(leap*i+sign)%10000;//用“万进制”的四位数 sign=(leap*i+sign)/10000;//类似十进制进位 } if(sign) { w++; str[j]=sign; sign=0; } } return w; } int main() { int num,i,j; while(cin>>num) { memset(str,0,sizeof(str)); j=solve(num); cout<<str[j-1]; for(i=j-2;i>=0;i--) cout<<setw(4)<<setfill('0')<<str[i];//没满四位数就填0 cout<<endl; } return 0; }
浙公网安备 33010602011771号