60的阶乘咋算呢??int 啊 long啊 肯定存不下。大家帮忙想想。我明早上开始写代码。

www.yinuoyuntian.com 2008-10-29 05:56:07
60的阶乘 我现在有几个初步的想法。
1用一个数组存结果。
2每位独立运算。(有点想不明白),进位啥的。。。
3.当然是一个int f(,int)

大家帮忙想想,嘿嘿。明天写不下去了,我就来看看大家的想法~~详细点最好啦~~

小弟先谢过了。
...全文
1116 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahjoe 2008-10-30
  • 打赏
  • 举报
回复
这个有实际用途吗
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jia_xiaoxin 的回复:]
大数阶乘,一般都用数组存储结果


C/C++ code#include<iostream>
using namespace std;

const int N=10000;
static int a[N];

int main()
{
int n;
cout<<"Please input the data of n."<<endl;
cin>>n;
int count=0;

while(n<0 && n>1000)
{
cerr<<"The value of n is too big."<<endl;
cout<<"Please input the …
[/Quote]

去掉了一个没用到的 变量。
增加了注释。希望对后来者有所帮助。

#include<iostream>
using namespace std;

const int N=10000; //加倆零
static int a[N];

int main()
{
int n; //键盘读数
cout<<"输入你想算的数.我告诉你它的阶乘,1到1000之间的数啊。"<<endl;
cin>>n;


if(n<0 || n>1000) // 读入数字是否有意义//加一个零
{
cout<<"输入的数不是太大就是太小。"<<endl;
cout<<"下次输入个1到1000之间的数.要不还是算不了。"<<endl;
//cin>>n;
}
else
{

int i,j,k; // i,j,k。传递 循环用,
int t=N-1; //n=10000 t=9999

a[0]=1; //第一位给 1
for(i=1;i<N;++i) //除第一位 每位赋初值 0
{
a[i]=0;
}

for(i=1;i<=n;++i) //从低往高走。1*2*3*4----*60 == 60!
{
for(j=0;j<N;++j) //从数组第一位走。。a[0]=a[0]* i ,a[1]=a[1] * i ,a[1]没有进位 所以是0.。。0*i =0.。
{
a[j]*=i;
} //对不为0的项 乘以 i。。未进位

for(k=0;k<N;++k) //从a[0]开始判断进位。 ~~~~~~~~**********这步貌似最费时间。还有上面那个循环体。
{
if(a[k]>9) //进位
{
a[k+1]=a[k+1]+a[k]/10; //十位以上的全给下一个单元
a[k]=a[k]%10; //当前单元保留个位
}
}
}

while(a[t]==0)//从最后一位开始判断。是零 就是没有意义,没有进位,没有东西。直到t出现非零项
{
--t;
}
cout<<"数据位数有:"<<(t+1)<<endl;
for(;t>=0;t--) //打印结果,从最高位开始输出。按位输出。
{
cout<<a[t];
}

cout<<endl; //清空数据缓存器
}
system("pause");
return 0;
}

dongchenghuozi 2008-10-30
  • 打赏
  • 举报
回复
const int num = 100;
void main()
{
int a[num] = {1};//每个元素最高代表千位
int n;
// cout<<a[1]<<endl;
cin>>n;
int i = 1;
int j = 0;
while(i <= n)
{
while(j<=num-1)
{
a[j]*=i;
j++;
}

for(int t = 0;t < num; t++)
{
a[t+1] += a[t]/1000;
a[t] = a[t]%1000;
}
i++;
j = 0;
}
cout<<n<<"!= ";
for(j = num-1;j >= 0; j--)
{
if(a[j]==0)continue;
if(a[j]<100)cout<<"0";
cout<<a[j];
}
cout<<endl;
}
  • 打赏
  • 举报
回复
嘿嘿,感谢各位啦。
特别感谢..zjk2752。呵呵

又懂了一点。每天都懂一点。

damo_xu 2008-10-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ahjoe 的回复:]
这个有实际用途吗
[/Quote]

看谁用了。

我前段也想写这个大数运算的class,效率高的话考虑一下FFT快速傅立叶。
可惜刚刚把这些基础工作做完了,就没有时间了,唉。
这个class以后可以帮你算RSA。兄弟,勉之!
yzfyzyl 2008-10-29
  • 打赏
  • 举报
回复
楼主搜索一下“4行算1000阶乘”



飞燕算法群:46520219
zjk2752 2008-10-29
  • 打赏
  • 举报
回复
long long 也存不下的,不能只定义一个变量来存放了结果了,必须要扩展,怎么扩展呢?用数组呀!定义一个char x[10000],我不信60的阶乘有一万位。这个题我以前也遇到过,用数组扩展的确挺好。
那么,第一步就是要计算60的阶乘有多少位了,这个应该比较容易实现,就是用以10为底的函数来实现从LOG1到LOG60的累加,这个可从阶乘的定义得到。
得到多少位了就定义一个数组来装每一位,然后就好办了,先将定义的数组初始为0,然后从1开始,一起到60,依次乘下去,要设置一个进位哦,就在把每一位乘1,乘2嘛,就像做乘法运算一样,的,应该也很容易想明白。
这个问题的关键就是用数组来存结果,不要用一个简单的LONG LONG。

下面是算法,原理明白了,应该很容易看明白的。
算法介绍:
问题描述:编写程序,对给定的n(n≦100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。
  由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[ ]存储:
    N=a[m]×10m-1+a[m-1]×10m-2+ … +a[2]×101+a[1]×100
  并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5!=120,在数组中的存储形式为:
3
0
2
1
……
  首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。
  计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。细节见以下程序。
# include
# include
# define MAXN  1000
void pnext(int a[ ],int k)
{   int *b,m=a[0],i,j,r,carry;
    b=(int * ) malloc(sizeof(int)* (m+1));
    for ( i=1;i<=m;i++)    b[i]=a[i];
    for ( j=1;j<=k;j++)
    {   for ( carry=0,i=1;i<=m;i++)
       {   r=(i           a[i]=r%10;
           carry=r/10;
       }
       if (carry) a[++m]=carry;
    }
    free(b);
    a[0]=m;
}
void write(int *a,int k)
{   int i;
    printf(“%4d!=”,k);
    for (i=a[0];i>0;i--)
       printf(“%d”,a[i]);
printf(“\n\n”);
}
void main()
{   int a[MAXN],n,k;
    printf(“Enter the number n: “);
    scanf(“%d”,&n);
    a[0]=1;
    a[1]=1;
    write(a,1);
    for (k=2;k<=n;k++)
    {   pnext(a,k);
       write(a,k);
       getchar();
    }
}
Donald_Duck 2008-10-29
  • 打赏
  • 举报
回复
最近刚写了一个大整数乘法的程序,你还是也写一个大整数阶乘程序吧,上网搜搜高精度算法,有很多可以参考的
yzfyzyl 2008-10-29
  • 打赏
  • 举报
回复
#include<stdio.h>
#define N 1000 //要计算的N //需要计算60阶乘的话只要把这个数改60,最大50000
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
s[a]=(b+=s[a]*t)%10000,b/=10000;
for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
return 0;
}


飞燕算法群:46520219
jia_xiaoxin 2008-10-29
  • 打赏
  • 举报
回复
大数阶乘,一般都用数组存储结果

#include<iostream>   
using namespace std;

const int N=10000;
static int a[N];

int main()
{
int n;
cout<<"Please input the data of n."<<endl;
cin>>n;
int count=0;

while(n<0 && n>1000)
{
cerr<<"The value of n is too big."<<endl;
cout<<"Please input the n again(1-1000)."<<endl;
cin>>n;
}

int i,j,k;
int t=N-1;

a[0]=1;
for(i=1;i<N;++i)
{
a[i]=0;
}

for(i=1;i<=n;++i)
{
for(j=0;j<N;++j)
{
a[j]*=i;
}

for(k=0;k<N;++k)
{
if(a[k]>9)
{
a[k+1]=a[k+1]+a[k]/10;
a[k]=a[k]%10;
}
}
}

while(a[t]==0)
{
--t;
}
cout<<"数据位数有:"<<(t+1)<<endl;
for(;t>=0;t--)
{
cout<<a[t];
if(a[i]==0)
{
++count;
}
}

cout<<endl;
return 0;
}
daidodo 2008-10-29
  • 打赏
  • 举报
回复
使用大整数,能算任意数的阶乘。
60!=
832098711274139014427634118322
336438075417260636124595244927
7696409600000000000000

Super.Jiju 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 ft1512975 的帖子:]
60的阶乘  我现在有几个初步的想法。
1用一个数组存结果。
2每位独立运算。(有点想不明白),进位啥的。。。
3.当然是一个int f(,int)

大家帮忙想想,嘿嘿。明天写不下去了,我就来看看大家的想法~~详细点最好啦~~

小弟先谢过了。
[/Quote]

自己定义一个数组来存储
自己定义乘法运算

要想简单,搜索一下大数阶乘或者1000!
帅得不敢出门 2008-10-29
  • 打赏
  • 举报
回复
大数运算求阶乘.
搜10000阶乘会有很多
erwin1984 2008-10-29
  • 打赏
  • 举报
回复
不对,64位整数存储不了 60的阶乘, 64位整数只有20位十进制左右,60的阶乘至少有60位以上,看来只能自己写大数运算了.
hagangqiou 2008-10-29
  • 打赏
  • 举报
回复
up
erwin1984 2008-10-29
  • 打赏
  • 举报
回复
VC用__int64, gcc 用 long long 应该可以了.
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
或者用unsigned long long(size是8位)
xhs_lh04 2008-10-29
  • 打赏
  • 举报
回复
long long
tian428 2008-10-29
  • 打赏
  • 举报
回复
double应该可以哈

64,637

社区成员

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

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