最近在面試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; }
運行的結果:
這裏有一個JavaScript版本的大數階乘