求超大数的阶乘,比如求800的阶乘!

龙宜坡 2008-12-09 08:09:42
今天去面试遇到这个题

求>500的数的阶乘,提示:阶乘的结果超过了double、decimal、long、的表示范围!

下面是我的解答,但是会出现误差,大家有好的办法给说个,谢谢!

struct SuperNumber
{
//底数
public double Num;
//指数
public int Index;

public static SuperNumber operator *(SuperNumber sn1,SuperNumber sn2)
{
SuperNumber sn=new SuperNumber();
sn.Num=sn1.Num*sn2.Num;
sn.Index=sn1.Index+sn2.Index;

where(sn.Num>10)
{
sn.Num/=10;
sn.Index++;
}

return sn;
}

public override string ToString()
{
return Num.ToString()+" X 10 的"+Index+"次方";
}
}

class Program
{
SuperNumber tmp=new SuperNumber();
SuperNumber sn=new SuperNumber();
sn.Num=1;
sn.Index=0;

for(int i=2;i<=800;i++)
{
tmp.Number=i;
sn=sn*tmp;
}

System.Console.WriteLine(sn.ToString());

System.Console.ReadKey();
}
...全文
499 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
raingi520 2009-03-29
  • 打赏
  • 举报
回复
Mark
龙宜坡 2008-12-11
  • 打赏
  • 举报
回复
@xiaochongzi520

期待你的代码
橙子撸代码 2008-12-11
  • 打赏
  • 举报
回复
好的解决办法是使用string存结果啊
乘的时候就把string拆分进行相乘

代码明天给你贴出来
龙宜坡 2008-12-11
  • 打赏
  • 举报
回复
有空仔细研究


在这个公司已经上班,结帖先!
橙子撸代码 2008-12-11
  • 打赏
  • 举报
回复
下面代码是用vs2005写的控制台程序
题目是求2000的阶乘
代码如下:

class Program
{

static void Main(string[] args)
{
string str = Test(2000);
Console.WriteLine(str);
Console.WriteLine("总长度:"+str.Length);
Console.ReadLine();
}
public static string Test(int num)
{
string strResult="";
for (int i = num; i > 1; i--)
{
strResult = ming(i, strResult);
//Console.WriteLine(strResult);
}
return strResult;
}
public static string ming(int num,string strResult)
{
if (strResult.Length > 0)
{
string strValue="";
int iValue = 0;
for (int i = strResult.Length - 1; i >= 0; i--)
{
if (Convert.ToInt16(strResult.Substring(i, 1)) != 0)
{
int x = Convert.ToInt16(strResult.Substring(i, 1)) * num + iValue;
iValue = 0;
if (x.ToString().Length > 1)
{
iValue = Convert.ToInt16(x.ToString().Substring(0, x.ToString().Length - 1));
strValue = Convert.ToInt16(x.ToString().Substring(x.ToString().Length - 1, 1)).ToString() + strValue;
}
else
{
strValue = x.ToString() + strValue;
}
}
else
{
if (iValue > 9)
{
strValue = Convert.ToInt16(iValue.ToString().Substring(iValue.ToString().Length - 1, 1)).ToString() +strValue;
iValue = Convert.ToInt16(iValue.ToString().Substring(0, iValue.ToString().Length - 1));
}
else
{
strValue = iValue.ToString() + strValue;
iValue = 0;
}
}
}
if (iValue != 0)
{
return iValue.ToString() + strValue;
}
else
{
return strValue;
}
}
else
{
strResult = num.ToString();
return strResult;
}
}
}


最主要的是看思路啊
我的解决办法可能不是很好啊
  • 打赏
  • 举报
回复
我操,太变态了!这强
龙宜坡 2008-12-10
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20001226/11/52263.html

这里也值得一看
lihuyin 2008-12-10
  • 打赏
  • 举报
回复
mark
wsdengjianglin 2008-12-10
  • 打赏
  • 举报
回复
用数组存结果不就可以了啊
龙宜坡 2008-12-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/liangbch/archive/2008/11/05/3230428.aspx

这里的文章值得一看
龙宜坡 2008-12-09
  • 打赏
  • 举报
回复
Haskell  Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell Brooks Curry,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以Lambda-Calculi(兰姆达演算)为基础发展而来.这也是为什么Haskell语言以希腊字母Lambda作为自己的标志.Haskell语言的最重要的两个应用是Glasgow Haskell Compliler(GHC)和Hugs(一个Haskell语言的编译器).特式是利用很简单的叙述就可以完成 Linked List、矩阵等数据结构。
  发展
  在80年代末已经出现了一些函数式编程语言,它们各有优缺点.为了使它们在科研上有一种统一的研究和发展的基础,应该有一种标准化的全新的语言使函数式编程语言在此基础上实现统一。接下来有人想以Miranda作为此项工作的出发点(而Miranda的开发者却对此项工作并不感兴趣)。就在这种背景下Haskell 1.0于1990年被公布。
  这种语言的最新版本是在原来版本的基础上经过修改的变体(Haskell-98-Standard 于1999年)。Haskell是现如今最广泛被用于研究的一种函数语言。现在以Haskell为基础的语言衍生物有很多,它们是:并行Haskell,扩充Haskell(旧名Goffin), Eager Haskell, Eden, DNA-Hakell 和面向对象的变体(Haskell++, O'Haskell, Mondrian)。另外Haskell还被作为在新语言设计时的样板,例如Python中的Lambda标记语句。
wangping_li 2008-12-09
  • 打赏
  • 举报
回复
还是8L的那个厉害,还真没有搞个大数的阶乘,测试下
vwxyzh 2008-12-09
  • 打赏
  • 举报
回复
用Haskell的话:
product [1..800]
ericllzh 2008-12-09
  • 打赏
  • 举报
回复
good
要深入学习
aln811 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shizhusz110 的回复:]
看下牛人写的:
# #include <stdio.h>
# #define N 10 //计算N的阶乘,修改N的定义可计算200000以内任意数的阶乘
# int a[N]={1},n=N,i,c,m;void main(){
# for(;n>1;(a[i]=c)>0?m++:0,n--)
# for(c=i=0;i <=m;i++)a[i]=(c+=a[i]*n)%10,c/=10;
# for(;m>=0;)printf("%d",a[m--]);}
[/Quote]

好厉害啊!
龙宜坡 2008-12-09
  • 打赏
  • 举报
回复
8楼的确实牛
shizhusz110 2008-12-09
  • 打赏
  • 举报
回复
看下牛人写的:
# #include <stdio.h>
# #define N 10 //计算N的阶乘,修改N的定义可计算200000以内任意数的阶乘
# int a[N]={1},n=N,i,c,m;void main(){
# for(;n>1;(a[i]=c)>0?m++:0,n--)
# for(c=i=0;i <=m;i++)a[i]=(c+=a[i]*n)%10,c/=10;
# for(;m>=0;)printf("%d",a[m--]);}
GTX280 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]
通过数组
参考
http://www.cnblogs.com/confach/articles/192703.aspx
[/Quote]
学习
空心兜兜 2008-12-09
  • 打赏
  • 举报
回复
好难...
龙宜坡 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]
通过数组
参考
http://www.cnblogs.com/confach/articles/192703.aspx
[/Quote]

这个可以!
加载更多回复(4)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧