^_^
你们写的算法都没考虑效率呀!
//在10进制情况下,末尾的零是怎样形成的呢:
//1。直接遇见末尾为0的乘数。如10、20、100等
//2。被乘数末位为2,4,6,8时又遇见尾数带5的
//乘数如5,15,25等。
//3。如4!=24,用5乘(忽略0)变为12,遇6变成72
//遇7变成504,遇8变成4032,遇9变成36288,跳过
//10,再与11乘时,可扔掉高2位,288*11即可...
//下面给出以上算法的代码
//用户输入正整数N,输出N阶乘最后那个非零位
#include<stdio.h>
typedef unsigned long ui4;
typedef unsigned short ui2;
ui2 mul(ui2,ui4);
int main()
{
ui4 N,n;
ui2 k,tail=1;
scanf("%li",&N);
for(n=2;n<=N;n++)
tail = mul(tail,n);
printf("last non-zero digit = %i\n",tail%10);
return 0;
}
ui2 mul(ui2 a,ui4 b)
{
ui2 mul=a;
//太饿了,等我填饱肚子再填mul()的肚子
return mul;
}
//下面给出以上算法的代码
//用户输入正整数N,输出N阶乘最后那个非零位
#include<stdio.h>
typedef unsigned long ui4;
ui4 mul(ui4,ui4);
int main()
{
ui4 N,n;
ui4 tail=1;
scanf("%li",&N);
for(n=2;n<=N;n++)
tail = mul(tail,n);
printf("last non-zero digit = ");
printf("%i\n",tail%10);
return 0;
}
ui4 mul(ui4 a,ui4 b)
{
ui4 mu=a;
if(b%2==0 && mu%5==0)
mu=mul(mu/5,b/2);
else if(b%5==0 && mu%2==0)
mu=mul(mu/2,b/5);
else
mu*=b;
return mu%10000;
}
//各位可用下列程序验证–★–
//给出的N!末尾非零位代码
//计算万以内(含10000)阶乘
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
short mul(short a[],short d,short x)
{ long i,y=0;
for(i=0;i<d;i++)
{ y+=a[i]*(long)x;//x:乘数
a[i]=(short)(y%10000);
y/=10000;
}
a[d]=(short)y;
return d+!!y;//返回(万进制下的)位数
}
void main()
{
long s;
short *a,i,j,n,ws=1;
printf("N=");scanf("%d",&n);
#define Pi 3.14159265358979323846L
s=(long)((log(2*Pi*n)/2+n*(log(n)-1))/log(10)+1);
a=(short*)malloc((s/4+2)*sizeof(short));*a=1;
for(i=2;i<=n;i++)
ws=mul(a,ws,i);
printf("%d!=%d",n,a[ws-1]);
for(j=ws-2;j>=0;j--)
printf("%04d",a[j]);
printf("\n");
free(a);
}