三一挖掘机滤芯:50分求解c语言!!

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/30 22:29:18
1000!的末5位不为0的数字是多少?
截至5月29日

我的方法貌似简单一些 因为我们只关心末尾不为零的5位,所以可以掐头去尾留中间(小学老师教我的给课文分段的方法。。。),每次把结果后面的零取掉,把前面的多于5位的掐(。。。)掉,可以不用高精度就搞定了 答案。。53472
#include<stdio.h>
int main()
{
int i;
long result=1;

for(i=2;i<=1000;i++)
{
result*=i;
while(result%10==0)
result/=10;
result%=100000;
}
printf("%ld\n",result);
return 0;
}

1000!可以求出来。然后%100000

因为是由我自己写的,所以算法上可能不够最简,不过功能都实现了/
编程计算1000!并输出(本例实现输入数据的阶乘算法,可以实现结果是10000位数的阶乘.如还想增大范围,可以改M值):
#define M 10000
main()
{
int i,j,k,temp1,temp2,N;
int sign=0;
int a[M];
clrscr();
printf("please input a num:");
scanf("%d",&N);
for(i=1;i<M;i++)
a[i]=0;
a[0]=1;

for(k=1;k<=N;k++)
{
sign=0;
for(i=M;i>=0;i--)
{
if(a[i]>=1)

sign=1;

if(sign==1)
{

temp1=a[i]*k;
a[i]=temp1%10;
temp1=(temp1-a[i])/10;
for(j=1;temp1!=0;j++)
{
temp2=temp1+a[i+j];
a[j+i]=temp2%10;
temp1=temp2/10;
}
}
}
}
sign=0;
printf(" %d! = \n",N);
for(j=M;j>=0;j--)
{
if(a[j]>=1)sign=1;
if(sign==1)
printf("%d",a[j]);
}
printf("\n");
getch();
}
报数问题(本程序仅用数组形式实现,另指针由于时间我没写):

#define N 50 /*参加人数 */
#define M 5 /*报数大小*/
main()
{
int a[N],i,j=0,k,sum=0;
for(i=0;i<N;i++)
a[i]=1;
for(i=0;;i++)
{
if (i==N)
{
i=0;
sum=0;
for(k=0;k<N;k++)
sum+=a[k];
}
if(sum==1)break;

if(a[i]==1)
{
j+=1;
if(j%M==0)
a[i]=0;
}

}

for (i=N-1; a[i]==0; i--);

for(j=i-4;j<=i;j++)
if(a[j]==1)
printf("%d\n",i);
}

/*不为零末五位数字分别为 5 3 4 7 2
程序如下已经改为可通过gcc编译*/
#include <stdio.h>

typedef struct
{
short number[38400];
int length;
} BigNumber;

void MULTS(BigNumber * a,int b,BigNumber * c)
{
int i,aa;
int cc=0;
for(i=0;i<a->length||cc!=0;++i) {
aa=i<a->length?a->number[i]:0;
cc+=aa*b;
c->number[i]=cc%10;
cc/=10;
}
c->length=i;
}

void init(BigNumber * b,int a)
{
int i;
for(i=0;a;++i) {
b->number[i]=a%10;
a/=10;
}
b->length=i;
}

void print(BigNumber * a)
{
int i = ( a->length == 0 ) ? 0 : a->length-1;
for(;i>=0;--i)
printf("%d",a->number[i]);
printf("\n");
}

BigNumber h(int n)//高精度实现,不过跑10000的阶乘要跑个几秒钟的
{
int i;
BigNumber res,tmp;
init(&res,1);
for(i=1;i<=n;++i)
{
MULTS(&res,i,&tmp);
res=tmp;
}
return res;
}

int main()
{
int i;
BigNumber res;
res=h(1000);
for(i=0;res.number[i]==0;++i);
printf("%d%d%d%d%d\n",res.number[i+4],res.number[i+3],res.number[i+2],res.number[i+1],res.number[i]);
return 0;
}