在笔试中,我想很多人都会遇到阶乘的编程题。今天突然想起自己的第一次笔试,就遇到了这样的题,还没在电脑上敲过。就随便来写一下,不知道大家在笔试的时候都写对了么?
很多人可能都会用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();
}
}
}