1000的阶乘怎么算的?

themayer 2004-07-06 08:56:55
用自定义类型算了半小时还没出结果
哪个大大给个方法或者提示?
...全文
333 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Unknowm 2004-07-07
  • 打赏
  • 举报
回复
for(int i=1;i<=n;i++)
sum=sum+log10(i);

我觉得这样算位数肯定会有误差,比如说x = log10(2),
y = log10(5),但由于x,y是浮点数,所以x+y未必正好等于1.0
peter9606 2004-07-07
  • 打赏
  • 举报
回复
mark
sunjx119 2004-07-06
  • 打赏
  • 举报
回复
mark
Chrisma 2004-07-06
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <exception.h>
class DEC{
char *n; //存放十进制数
public:
DEC(long);
DEC(char *d);
DEC(DEC const &d);
virtual ~DEC( );
virtual DEC operator-( )const;
virtual DEC operator+(const DEC &d) const;
virtual DEC operator-(const DEC &d) const;
virtual DEC operator*(const DEC &d) const;
virtual DEC operator/(const DEC &d) const;
virtual DEC operator%(const DEC &d)const;
virtual int operator>(const DEC &d)const;
virtual int operator<(const DEC &d)const;
virtual int operator==(const DEC &d)const;
virtual DEC &operator=(const DEC &d);
virtual DEC operator++(int);
virtual DEC operator--(int);
virtual DEC &operator--( );
virtual DEC &operator++( );
virtual operator const char *( )const;
};
DEC::DEC(long m){
char s[100];
ltoa(m, s, 10);
DEC::n=new char[strlen(s)+1];
strcpy(DEC::n, s);
}
DEC::DEC(char *n){
DEC::n=new char[strlen(n)+1];
if(n[0]=='+') strcpy(DEC::n, n+1);
else{
if(n[0]=='-'&&n[1]=='0') strcpy(DEC::n, n+1);
else strcpy(DEC::n, n);
}
}
DEC::DEC(const DEC &d){
if(n=new char[strlen(d.n)+1]) strcpy(n, d.n);
}
DEC::~DEC( ){ if(n) { delete n; n=0; } }
DEC DEC::operator-( )const{
char *t=new char [strlen(n)+2];
if(n[0]=='-') strcpy(t, n+1);
else strcat(strcpy(t,"-"),n);
DEC r(t);
delete t;
return r;
}
DEC &DEC::operator=(const DEC &d){
delete n;
if(n=new char[strlen(d.n)+1]) strcpy(n, d.n);
return *this;
}
int DEC::operator>(const DEC &d)const{
int h=strlen(n),k=strlen(d.n);
switch(n[0]){
case '-':
switch(d.n[0]){
case '-':
if(h==k){
for(k=0; k<h; k++){
if(n[k]==d.n[k]) continue;
if(n[k]<d.n[k]) return 1;
return 0;
}
return 0;
}
if(h<k) return 1;
return 0;
default :
return 0;
};
default :
switch(d.n[0]){
case '-':
return 1;
default :
if(h==k){
for(k=0; k<h; k++){
if(n[k]==d.n[k]) continue;
if(n[k]<d.n[k]) return 0;
return 1;
}
return 0;
}
if(h<k) return 0;
return 1;
}
}
}
int DEC::operator< (const DEC &d)const{ return d>*this || d==*this; }
int DEC::operator==(const DEC &d)const{ return strcmp(n, d.n)==0;}
DEC DEC::operator+(const DEC &d) const{
switch(n[0]){
case '-':
switch(d.n[0]){
case '-':
return -(-*this+(-d));
default :
return d-(-*this);
};
default :
switch(d.n[0]){
case '-':
return *this-(-d);
default :
int m, c=0, p=strlen(n), q=strlen(d.n);
if(p>q) m=p; else m=q; m+=2;
char *t=new char[m]; t[--m]=0;
while (p>0 && q>0){
c=c+n[--p]+d.n[--q]-2*'0';
t[--m]=((c>=10)?c-10: c)+'0';
c=(c>=10)? 1: 0;
}
while (p>0){
c=c+n[--p]-'0';
t[--m]=((c>=10)?c-10: c)+'0';
c=(c>=10)?1: 0;
}
while (q>0){
c=c+d.n[--q]-'0';
t[--m]=((c>=10)?c-10: c)+'0';
c=(c>=10)?1: 0;
}
if(c>0) {t[--m]='1'; }
DEC x(t+m);
delete t;
return x;
};
};
}
DEC DEC::operator-(const DEC &d) const{
switch(n[0]){
case '-':
switch(d.n[0]){
case '-':
return (-d)-(-*this);
default :
return -(-*this+d);
};
default :
switch(d.n[0]){
case '-':
return *this+(-d);
default :
if(d>*this) return -(d-*this);
int m, k, c=0, p=strlen(n), q=strlen(d.n);
if(p>q) m=p; else m=q; k=m+=2;
char *t=new char[m]; t[--m]=0;
while (p>0 && q>0){
c=n[--p]-d.n[--q]-c;
t[--m]=((c<0)?c+10: c)+'0';
c=(c<0)? 1: 0;
}
while (p>0){
c=n[--p]-'0'-c;
t[--m]=((c<0)?c+10: c)+'0';
c=(c<0)? 1: 0;
}
while (q>0){
c='0'-d.n[--q]-c;
t[--m]=((c<0)?c+10: c)+'0';
c=(c<0)? 1: 0;
}
if(c>0) {t[--m]='-'; }
else for(k=k-2; m<k && t[m]=='0'; m++);
DEC x(t+m);
delete t;
return x;
};
};
}
DEC DEC::operator*(const DEC &d) const{
if(n[0]=='0' ||d.n[0]=='0') return DEC("0");
switch(n[0]){
case '-':
switch(d.n[0]){
case '-':
return (-d)*(-*this);
default :
return -(-*this*d);
};
default :
switch(d.n[0]){
case '-':
return -(*this*(-d));
default :
int v,w, c, p=strlen(n), q=strlen(d.n);
DEC r("0");
DEC b((p>q)?n:d.n);
DEC m((p>q)?d.n:n);
for(v=0, w=((p>q)?q:p); v<w; v++){
char *t=new char[strlen(r.n)+2];
r=strcat(strcpy(t, r.n), "0");
delete t;
for(c=m.n[v]-'0'; c>0; c--) r=r+b;
}
if (strlen(r.n)==0) return DEC("0");
return r;
}
}
}
DEC DEC::operator/(const DEC &d) const{
if(d.n[0]=='0') throw new exception;
switch(n[0]){
case '-':
switch(d.n[0]){
case '-':
return (-*this)/(-d);
default :
return -(-*this/d);
};
default :
switch(d.n[0]){
case '-':
return -(*this/(-d));
default :
if(d>*this) return DEC("0");
int v,w, c, p=strlen(n), q=strlen(d.n);
char *r=new char[p+1], *t=new char[p+1];
w=p-q+1;
for(v=0; v<q; v++) t[v]=n[v]; t[q]=0;
for(v=0; v<w; v++){
c=0;
while (DEC(t)>d) {strcpy(t, (DEC(t)-d).n); c++; }
r[v]=c+'0'; r[v+1]=0;
if(t[0]=='0') t[0]=n[q+v];
else{
c=strlen(t);
t[c]=n[q+v];
t[c+1]=0;
}
}
for(v=0; v<p && r[v]=='0'; v++);
DEC s(r+v);
delete r;
delete t;
return s;
}
}
}
DEC DEC::operator%(const DEC &d)const{ return *this-(*this/d)*d; }
DEC::operator const char *( ) const{ return n; }
DEC &DEC::operator++( ){ return *this=*this+"1"; }
DEC DEC::operator++(int){ DEC r(*this); ++(*this); return r; }
DEC &DEC::operator--( ){ return *this=*this-DEC("1"); }
DEC DEC::operator--(int){ DEC r(*this); --(*this); return r; }
void main( ){
DEC w("1"), x("0"), y("1"), z("0");
++x="100";
x="0";
for(int k=1; k<5; k++) w=w*k;
printf("%s\n", w);
for(int k=1; k<5; k++) x=x+DEC(k);
printf("%s\n", x);
for(x=1; x<DEC("1000000000000000000000000"); x++) y=y*x;
printf("%s\n", y);
for(x="1"; x<DEC("1000000000000000000000000"); x++) z=z+x;
printf("%s\n", z);
}
dayn9 2004-07-06
  • 打赏
  • 举报
回复
数值计算我不懂,所以请教一下log10()这种东西是如何实现的?

我能想到的就是展开成无穷级数,取前有限项近似计算。
如果真是这样,恐怕依靠这种函数的算法都不会太快。
downcast 2004-07-06
  • 打赏
  • 举报
回复
int getBitNum(int n)
{
double sum=1.0;
for(int i=1;i<=n;i++)
sum=sum+log10(i);
return sum; // 这里是不是该取个ceil再return啊?
}
o1n 2004-07-06
  • 打赏
  • 举报
回复
楼上的可以,强!!
原来可以用这样的办法.
baibinbin 2004-07-06
  • 打赏
  • 举报
回复
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<stdlib.h>

int getN();
int getBitNum(int n);
char * init(int size);
void calc(char *a,int n);
void display(char *a,int size);

void main()
{
int n=getN();

int size=getBitNum(n);
// cout<<size<<endl;
char *pa=init(size);
calc(pa,n);
display(pa,size);
delete []pa;

}

int getN()
{
int n;
do{
cout<<"input a number ";
cout<<"n=";
cin>>n;
}while(n<0);
return n;
}

int getBitNum(int n)
{
double sum=1.0;
for(int i=1;i<=n;i++)
sum=sum+log10(i);
return sum;
}

char *init(int size)
{
char *pa=new char[size];
if(!pa)
{
cout<<"two large factor of"<<size<<endl;
exit(1);
}
else{
pa[0]=1;
for(int i=1;i<size;i++)
pa[i]=0;
}
return pa;
}

void calc(char *pa,int size)
{
double bitcount=1;
int begin=0;
for(int i=2;i<=size;i++)
{
long and=0;
bitcount+=log10(i);
if(pa[begin]==0)
begin++;
for(int j=begin;j<int(bitcount);j++)
{
and+=i*pa[j];
pa[j]=char(and%10);
and=and/10;
}
}
}

void display(char *pa,int size)
{
int bit=0;
for(int i=size-1;i>=0;i--)
{
if(bit%50==0)
cout<<endl<<"第"
<<setw(3)<<(bit/50+1)<<"个50位:";
cout<<(int)pa[i];
bit++;
}
cout<<endl;
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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