我刚编的一个求高位数阶乘的,省得今天有人问最后一个非零位,你又问第二位,呵呵
#include <stdio.h>
void cal_fal(int result[],int n,int num)
{
int i=1,j,k;
while(i<=num)
{
if(i==1)
result[0]=1;
for(k=0;k<n;k++)
result[k]*=i;
i++;
for(j=0;j<n;j++)
if(result[j]>=10)
{
result[j+1]+=result[j]/10;
result[j]%=10;
}
}
}
main()
{
int result[300]={0};
int i,k;
long num;
printf("Please input a number:");
scanf("%ld",&num);
cal_fal(result,300,num);
i=299;
while(result[i]==0)
i--;
for(k=i;k>=0;k--)
printf("%d",result[k]);
getch();
}
//思路:
//1.由于只取左起第二位,所以只要求近似值即可
//2.由于N可能高达10万,所以先求n!的常用对数
#include<stdio.h>
#include<math.h>
int main(void)
{ double lgf=0;
char str[20];
long N,i;
scanf("%ld",&N);
for(i=2;i<=N;i++)
lgf+=log(i)/log(10);//换底公式
lgf-=(long)lgf;//截整
lgf=pow(10,lgf);//至此得到n!的"尾数"
sprintf(str,"%lf",lgf);
printf("%c\n",str[2]);//跳过个位和小数点
}
我刚编的一个求高位数阶乘的,省得今天有人问最后一个非零位,你又问第二位,呵呵
main()
{
int result[300]={0};
int i,k;
long num;
printf("Please input a number:");
scanf("%ld",&num);
cal_fal(result,300,num);
.........................................
}
朋友,您这程序可只管300位哪。而且您太“阔绰”
竟然让一个int(2~4 bytes)存放区区0~9。实际上
对于short int,可让它玩玩“万进制”即令其存放
0~9999。对于long int,让他来个“亿进制”或
“十亿进制”不为过吧?为什么要这样做呢?为了
提速度、省内存、显实力。
总之,更高、更快、更强。