最近在面試flash的時候,出了道題目:用程式求1000的階乘。
說出這個問題的時候,有兩種情況,一種會問:“階乘是什麼?”,另外一種可能會想,這個結果會走出Number型能表述的上限。
之前業餘的時候寫了兩個版本:AS3、C++,C++是大二學過後再沒碰過了,寫的時候查了資料
AS3版本的大數階乘:
package
{
import flash.display.Sprite;
public class AlgorithmDemo extends Sprite
{
public function AlgorithmDemo()
{
initView();
}
private function initView():void
{
var num:uint = 5;
var val:String = factorial(num);
trace(num + "! = " + val);
}
private function factorial(n:int):String
{
var a:Array = [1];
for (var i:int = 1; i <=n; i++)
{
for (var j:int = 0, c:int = 0; j < a.length || c != 0; j++)
{
var m:int = (j < a.length) ? (a[j] * i + c) : c;
a[j] = m % 10;
c = m / 10;
}
}
return a.reverse().join("");
}
}
}
C++版本的:
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
int main() {
vector<int> myVector;
vector<int>::iterator it;
stringstream ss;
string str;
int n;
cout<<"請輸入您需要計算的階乘值(1~1000):";
cin>>n;
if(n <= 0 || n > 1000) {
cout<<"輸入的值不符合要求。\n";
system("pause");
return 0;
}
myVector.push_back(1);
for (int i = 1; i <= n; i++) {
for (int j = 0, c = 0; j < myVector.size() || c != 0; j++) {
int m = (j < myVector.size()) ? (myVector[j] * i + c) : c;
int p = m % 10;
if (j < myVector.size()) {
myVector[j] = p;
}
else {
myVector.push_back(p);
}
c = m / 10;
}
}
reverse(myVector.begin(), myVector.end());
for (it = myVector.begin(); it != myVector.end(); ++it) {
ss<<*it;
}
str = ss.str();
cout<<n<<"的階乘結果為:"<<str<<"\n";
system("pause");
return 0;
}
執行的結果:
![image image](https://i.iter01.com/images/1b3cd8f41edd3ff3b7fe44265680077bffd6e0d04c6e5766d7256ec5510a6414.png)
這裡有一個JavaScript版本的大數階乘