笔试常见的“阶乘”编程题,你写对了么?

      在笔试中,我想很多人都会遇到阶乘的编程题。今天突然想起自己的第一次笔试,就遇到了这样的题,还没在电脑上敲过。就随便来写一下,不知道大家在笔试的时候都写对了么?
      很多人可能都会用int ,double之类的类型来存储结果,可是这样就很容易出现溢出的情况,不信您来试试100的阶乘!
      其实回头想想,如果当初这个我用Perl,然后用bigint类型写也许就不用这么麻烦了。 而且Erlang貌似也有个阶乘模块可以直接写。先抛开这些不谈,用Java,C#之类的强类型语言,我们就要考虑溢出的情况,于是就有了以下的代码。
      不过我刚才求了一次12345的阶乘,结果发现速度很慢,希望大家指教有没有什么效率更高一些的算法。

ContractedBlock.gif ExpandedBlockStart.gif Code
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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值