笔试题:计算N的阶乘

本文介绍了一种使用字符串表示大数,并实现大数加法、乘法的方法。通过这些基本运算,进一步实现了计算大整数阶乘的功能。提供了Java和C++两种语言的实现代码。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
publicclasstest
{
//简单起见,不考虑负号的情况
privatestaticStringmultipy(Stringnum1,Stringnum2)
{
//大数乘法
Stringresult="0";
inti,j,n1,n2;
intlen1=num1.length();
intlen2=num2.length();
if(len1<len2)
{
for(i=len1-1;i>=0;--i)
{
n1
=num1.charAt(i)-'0';
Stringsum
="0";
for(j=0;j<n1;++j)
{
sum
=add(sum,num2);
}
StringBuildertmpSB
=newStringBuilder(sum);
for(j=i;j<len1-1;++j)
{
tmpSB.append(
"0");
}
result
=add(result,tmpSB.toString());
}
}
else
{
for(i=len2-1;i>=0;--i)
{
n2
=num2.charAt(i)-'0';
Stringsum
="0";
for(j=0;j<n2;++j)
{
sum
=add(sum,num1);
}
StringBuildertmpSB
=newStringBuilder(sum);
for(j=i;j<len2-1;++j)
{
tmpSB.append(
"0");
}
result
=add(result,tmpSB.toString());
}
}

returnresult;
}
privatestaticStringadd(Stringnum1,Stringnum2)
{
//大数加法
Stringresult="";
intlen1=num1.length();
intlen2=num2.length();
intnAddOn=0;//进位
inti,j,n1,n2,sum;
StringBuildersb
=newStringBuilder();
for(i=len1-1,j=len2-1;i>=0&&j>=0;--i,--j)
{
n1
=num1.charAt(i)-'0';
n2
=num2.charAt(j)-'0';
sum
=n1+n2+nAddOn;

if(sum>=10)
{
nAddOn
=1;
}
else
{
nAddOn
=0;
}
sb.append(sum
%10);
}
if(len1>len2)
{
//第一个有剩余
for(;i>=0;--i)
{
n1
=num1.charAt(i)-'0';
sum
=n1+nAddOn;
if(sum>=10)
{
nAddOn
=1;
}
else
{
nAddOn
=0;
}
sb.append(sum
%10);
}
}
elseif(len2>len1)
{
//第二个有剩余
for(;j>=0;--j)
{
n2
=num2.charAt(j)-'0';
sum
=n2+nAddOn;
if(sum>=10)
{
nAddOn
=1;
}
else
{
nAddOn
=0;
}
sb.append(sum
%10);
}
}

if(nAddOn>0)
{
sb.append(nAddOn);
}

sb.reverse();
result
=sb.toString();
returnresult;
}
privatestaticStringfactorial(intn)
{
Stringresult
="1";
for(inti=n;i>=2;--i)
{
result
=multipy(result,String.valueOf(i));
}
returnresult;
}
publicstaticvoidmain(String[]args)throwsException
{
//计算100的阶乘!
System.out.println(factorial(100));
}

}
再来个c++版做对比
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
//简单起见,不考虑负号的情况

#include
<iostream>
#include
<vector>
#include
<algorithm>
usingnamespacestd;

stringadd(stringnum1,stringnum2)
{
//大数加法
stringresult="";
intlen1=num1.length();
intlen2=num2.length();
intnAddOn=0;//进位
inti,j,n1,n2,sum;
vector
<char>tmpSum;

for(i=len1-1,j=len2-1;i>=0&&j>=0;--i,--j)
{
n1
=num1[i]-'0';
n2
=num2[j]-'0';
sum
=n1+n2+nAddOn;

if(sum>=10)
{
nAddOn
=1;
}
else
{
nAddOn
=0;
}
tmpSum.push_back(sum
%10+'0');
}
if(len1>len2)
{
//第一个有剩余
for(;i>=0;--i)
{
n1
=num1[i]-'0';
sum
=n1+nAddOn;
if(sum>=10)
{
nAddOn
=1;
}
else
{
nAddOn
=0;
}
tmpSum.push_back(sum
%10+'0');
}
}
elseif(len2>len1)
{
//第二个有剩余
for(;j>=0;--j)
{
n2
=num2[j]-'0';
sum
=n2+nAddOn;
if(sum>=10)
{
nAddOn
=1;
}
else
{
nAddOn
=0;
}
tmpSum.push_back(sum
%10+'0');
}
}

if(nAddOn>0)
{
tmpSum.push_back(nAddOn
+'0');
}
reverse(tmpSum.begin(),tmpSum.end());
copy(tmpSum.begin(),tmpSum.end(),back_inserter(result));
returnresult;
}

stringmultipy(stringnum1,stringnum2)
{
//大数乘法
stringresult="0";
inti,j,n1,n2;
intlen1=num1.length();
intlen2=num2.length();
if(len1<len2)
{
for(i=len1-1;i>=0;--i)
{
n1
=num1[i]-'0';
stringsum="0";
for(j=0;j<n1;++j)
{
sum
=add(sum,num2);
}

stringtmpSB(sum);
for(j=i;j<len1-1;++j)
{
tmpSB.append(
"0");
}
result
=add(result,tmpSB);
}
}
else
{
for(i=len2-1;i>=0;--i)
{
n2
=num2[i]-'0';
stringsum="0";
for(j=0;j<n2;++j)
{
sum
=add(sum,num1);
}
stringtmpSB(sum);
for(j=i;j<len2-1;++j)
{
tmpSB.append(
"0");
}
result
=add(result,tmpSB);
}
}

returnresult;
}


stringfactorial(intn)
{
stringresult="1";
charbuff[100];
for(inti=n;i>=2;--i)
{
result
=multipy(result,_itoa(i,buff,10));
}
returnresult;
}

intmain()
{
intN;
while(cin>>N)
{
cout
<<factorial(N).c_str()<<endl;
}
return0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值