<!--<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++版做对比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));
}
}
<!--<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;
}
//简单起见,不考虑负号的情况
#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;
}
本文介绍了一种使用字符串表示大数,并实现大数加法、乘法的方法。通过这些基本运算,进一步实现了计算大整数阶乘的功能。提供了Java和C++两种语言的实现代码。
883

被折叠的 条评论
为什么被折叠?



