逻辑上说这里应该是Data[j] >= 10,可能是笔误写成了>。但这又不影响结果,为什么呢?
因为不论N取什么值,都没有Data[j]=10的情况(我是说运行到if(Data[j]>10)的时候不会有)。其实只要自己算几遍就知道了,最有可能出现10的是N=5,循环到i=5时,data[1]=4,data[2]=2,接着data[1]乘五变成20,data[2]变成10(好像变成10了哦),但执行if(Data[j]>10)时,data[1]先判,此时data[1]变成0,data[2]变成了12(与10擦肩而过)。。。。
当i>10时,不用讨论了,Data[j]*i要么比十大,要么比十小了。
总结下,这个算法写的真一般。。。。
#include
#include
const int maxsize=5002;
const int base=100000;
using namespace std;
struct BigNumber{
int x[maxsize],size,i,j;
BigNumber(int t):size(0){
memset(x,0,sizeof(x));
for(;t;t/=base)
x[size++]=t%base;
}
BigNumber():size(0){
memset(x,0,sizeof(x));
}
void print(){
int i=size?size-1:0;
printf("%d",x[i]);
while(i--){
for(j=10;j*x[i]
printf("%d",x[i]);
}
}
BigNumber operator*(int r){
int i=0,k=0;
BigNumber tmp;
while(i
tmp.x[i++]=k%base;
k/=base;
}
tmp.size=i;
return tmp;
}
};
int main()
{
int n;
while(1)
{
cout << "Please input n to calculate n!: ";
cin >> n;
if(cin.fail()||n>10000 || n<0)
{
cin.clear();
cin.sync();
cout << "Input error or number too large! Try again!" << endl;
continue;
}
BigNumber Num(1);
for(int i=2;i<=n;i++)
{
Num = Num*i;
}
cout << n << "! = ";
Num.print();
cout << endl << endl;
}
//system("pause");
}
第一个问题,将输入参数做一个判断,伪代码:if (nNum<1 || nNum>1000) goto Error
第二个问题改用double类型
等一下,我翻一下记录,我一前写的高精度阶乘应该没删
#include
#include
#include
#include
main()
{
float s=1;int n,i,t;
scanf("%d",&n);
t=n%1;
if(t==0)
{
for(i=1;i<=n;i++)
{s=s*i;}
printf("%.0f",s);}
else
{
printf("1");}
getch();
}