面試題:階乘問題

weixin_34304013發表於2011-11-02

在筆試中,我想很多人都會遇到階乘的程式設計題。今天突然想起自己的第一次筆試,就遇到了這樣的題,還沒在電腦上敲過。就隨便來寫一下,不知道大家在筆試的時候都寫對了麼?

      很多人可能都會用int ,double之類的型別來儲存結果,可是這樣就很容易出現溢位的情況,不信您來試試100的階乘!
      其實回頭想想,如果當初這個我用Perl,然後用bigint型別寫也許就不用這麼麻煩了。而且Erlang貌似也有個階乘模組可以直接寫。先拋開這些不談,用Java,C#之類的強型別語言,我們就要考慮溢位的情況,於是就有了以下的程式碼。
      不過我剛才求了一次12345的階乘,結果發現速度很慢,希望大家指教有沒有什麼效率更高一些的演算法。
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("請輸入你要計算的數字:");
long n = Convert.ToInt64(Console.ReadLine());
Console.Write("{0}的階乘是:", n);
Console.WriteLine(GetResult(n));
}
static string GetResult(long n)
{
List<long> listResult = new List<long>();
listResult.Add(1);

int posCount=1;//記錄總位數
for (long i = 1; i <= n; i++)
{
long carry = 0;
for (int j = 0; j < posCount; j++)
{

//先相乘
listResult[j] *= i;
//加上進位
listResult[j] += carry;
long temp = listResult[j];
//儲存個位數
listResult[j] %= 10;
carry = temp / 10;
if (carry > 0 && j==listResult.Count-1)
{
posCount++;
listResult.Add(0);
}
}
}

StringBuilder sb = new StringBuilder();
for (int i = listResult.Count-1; i >=0 ; i--)
{
sb.Append(listResult[i].ToString());
}
return sb.ToString();
}
}
}
 
 

相關文章