您的位置 首页 百科

1000的阶乘_1000的阶乘后面有多少个0

1000的阶乘
1到10000的阶乘结果中,含有0到9连续循环数字的最大长度是多少,具体是哪个阶乘?

  • 从 1! 到 10000! 结果中,有不少含有0到9连续循环数字,可以是 01234,也可以是 789012。例如,1935! 结果中含有 34567890,5141! 结果中含有 78901234 ……求:含有最长连续循环数字的是哪个阶乘,连续循环数字的长度是多少?另外,以程序搜寻答案耗时很长,大约160分钟,有否更快的算法?
  • 你好,下面是我给出的fortran计算方法module searchcircleimplicit nonetype circleinteger(8):: p ! positioninteger(8):: whichdigitinteger(2), allocatable:: cir(:)integer(8):: clen =1end typetype(circle):: c1, c2integer(2), allocatable:: str(:)integer(8):: a(1000000)=0, x=1000000, d=2, npointer! 初始化containssubroutine biginteger2stringimplicit none!integer(8), intent(in):: a(:)!integer(8), intent(in):: dinteger(8):: ii, n1, nn, ntemp, j, kn1 = floor(log10(1.*a(d-1))) + 1nn = n1 + 6*(d-2)if(allocated(str))deallocate(str)allocate(str(nn))k=0do ii = nn, n1+1, -6 k = k+1 ntemp = a(k) do j = 0, 5, 1 str(ii-j) = mod(ntemp,10) ntemp = ntemp/10 enddoenddontemp = a(d-1)do ii = n1, 1, -1 str(ii) = mod(ntemp,10) ntemp = ntemp/10enddo!write(*,*)!write(*,*)npointer,!=!do ii = 1, nn, 1! write(*,(I1),advance="no")str(ii)!enddoend subroutine biginteger2stringsubroutine findmaxcir(p)implicit noneinteger(8), intent(in)::pinteger(8):: ii, j, k, nstr, n, clennstr = size(str)ii = 1!write(*,*)———,pdo while(iinstr) clen = 1 do while((str(ii+1)-str(ii).eq.1.or.(str(ii).eq.9.and.str(ii+1).eq.0)).and.iinstr) clen = clen + 1 ii = ii + 1 enddo if(clenc1%clen)then c1%clen = clen if(allocated(c1%cir))deallocate(c1%cir) c1%whichdigit = ii + 1 – clen c1%p = p allocate(c1%cir(clen)) c1%cir(1:clen:1) = str(ii+1-clen:ii:1) write(*,300)p, ii + 1 – clen, clen 300 format(I5,"! ===","从高到低第",I6,3X,"位有连续循环数字串:","长度为",I2) write(*,*)字符串为: do j = 1, clen, 1 write(*,(I1),advance="no")c1%cir(j) enddo write(*,(/)) endif ii = ii + 1enddoend subroutine findmaxcirend module searchcircleprogram main use searchcircle integer(8):: r, s, i, j, n real(8):: t1, t2 !c1%clen = 1 read(*,*)n call cpu_time(t1) a(1) = 1 do i=2, n, 1 !a(i) = 0 r = 0 do j = 1, d, 1 s = a(j) * i + r r = s/x a(j) = mod(s, x) enddo if(a(d).ne.0)d=d+1 npointer = i call biginteger2string call findmaxcir(i) enddo write(*,*)"#####################################" write(*,300)c1%p, c1%whichdigit, c1%clen 300 format("最大连续循环数字串为:",I5,"!

下面是我模拟手工算法10000阶乘的程序,为什么会输出很多负数

  • # include stdio.h# include int main(){ int a[40000],t,b[40000],c[40000],d[40000],e[40000],x,k1,k2,k3,k4,i,flag,j; t=0; a[40000]=1; for(i=2;i=9999;i++) { k1=i%10; k2=(i-k1)10%10; k3=(i-k1-k2*10)100%10; k4=(i-k1-k2*10-k3*100)1000; for(j=0;j=40000;j++) { b[j]=0; c[j]=0; d[j]=0; e[j]=0; } for(j=0;j=40000;j++) { if(a[j]!=0) { flag=j; break; } } t=0; for(j=40000;j=0;j–) { x=a[j]*k1+t; b[j]=x%10; t=x10; } b[flag-1]=t; t=0; for(j=40000;j=0;j–) { x=a[j]*k2+t; c[j-1]=x%10; t=x10; } c[flag-2]=t; t=0; for(j=40000;j=0;j–) { x=a[j]*k3+t; d[j-2]=x%10; t=x10; } d[flag-3]=t; t=0; for(j=40000;j=0;j–) { x=a[j]*k4+t; e[j-3]=x%10; t=x10; } e[flag-4]=t; t=0; for(j=40000;j=0;j–) { x=b[j]+c[j]+d[j]+e[j]+t; a[j]=x%10; t=x10; } } for(i=0;i=40000;i++) if(a[i]!=0) { flag=i; break; }for(i=flag;i=40000;i++) printf("%d",a[i]); printf("0000n"); printf("n"); printf("%dn",flag); return 0;}
  • int装不下了 ,溢出了。

C语言阶乘问题

  • #include stdio.hvoid Print_Factorial ( const int N );int main(){ int N; scanf("%d", &N); Print_Factorial(N); return 0;}void Print_Factorial ( const int N ){ int p=1,i; if(N1000||N0) printf("Invalid input.n"); else { if(N==0) p=1; else for(i=1;i=N;i++) p=p*i; printf("%dn", p); }}为什么错了呢?
  • 常见的有两种:递归版本:int Fac(int n){ if(n==0) return 1; return n*Fac(n-1);}还有一种是循环版:int ans=1; for(int i=1;i=n;i++) ans*=i;测试方法:#includestdio.hint Fac(int n){ if(n==0) return 1; return n*Fac(n-1);}int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans=1; for(int i=1;i=n;i++) ans*=i; printf("%d %dn",ans,Fac(n)); } return 0;}有个值得注意的地方:阶乘时,数增大的很快,在n达到13时就会超过int的范围,此时可以用long long或是 __int64来存储更高精度的值,如果还想存储更高位的,需要用数组来模拟大数相乘。

C语言高精度阶乘 一些疑问 求解答

  • #includestdio.h#includestring.hconst int maxn=3000;int main(){ int f[maxn]; int i,j,n; scanf("%d",&n); memset(f,0,sizeof(f)); f[0]=1; for(i=2;i=n;i++) { int c=0; for(j=0;jmaxn;j++) { int s=f[j]*i+c; f[j]=s%10; c=s10; } } for(j=maxn-1;j=0;j–)if(f[j])break; for(i=j;i=0;i–)printf("%d",f[i]); printf("n"); return 0;}这个程序是求1000以内阶乘,但是我不懂要怎么理解这4个for语句要怎么理解啊 求指点
  • for(i=2;i=n;i++) 从2乘到nfor(j=0;jmaxn;j++) 模拟大数乘法 这个程序的核心所在,得到的结果是逆序存储的比如结果3628800存在f中是0088263for(j=maxn-1;j=0;j–)由于逆序存储,所以结尾的0相当于高位的0,是没意义的 截除for(i=j;i=0;i–)printf("%d",f[i]); 逆序输出每位,其实就是正序的结果了

C语言阶乘问题

  • #include stdio.hvoid Print_Factorial ( const int N );int main(){ int N; scanf("%d", &N); Print_Factorial(N); return 0;}void Print_Factorial ( const int N ){ int p=1,i; if(N1000||N0) printf("Invalid input.n"); else { if(N==0) p=1; else for(i=1;i=N;i++) p=p*i; printf("%dn", p); }}为什么错了呢?
  • 常见的有两种:递归版本:int Fac(int n){ if(n==0) return 1; return n*Fac(n-1);}还有一种是循环版:int ans=1; for(int i=1;i=n;i++) ans*=i;测试方法:#includestdio.hint Fac(int n){ if(n==0) return 1; return n*Fac(n-1);}int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans=1; for(int i=1;i=n;i++) ans*=i; printf("%d %dn",ans,Fac(n)); } return 0;}有个值得注意的地方:阶乘时,数增大的很快,在n达到13时就会超过int的范围,此时可以用long long或是 __int64来存储更高精度的值,如果还想存储更高位的,需要用数组来模拟大数相乘。

用C语言写一下这个程序试下

  • 题目描述一个正整数如果等于组成它的各位数字的阶乘之和,该整数称为阶乘和数。 例如,145=1!+4!+5!,则145是一个三位阶乘和数。单龚厕夹丿蝗搽伟敞连 请问:共有多少个阶乘和数?输入输出所有的阶乘和数(按字典序,即1打头的在前,2打头的次之,…, 空格分隔,含末尾空格)1 145 2 ????? 样例输入样例输出提示提示:8*9!=8*36288010000000
  • 写一下这个

1000的阶乘相关资讯