您的位置:首页 > 职场人生

关于在面试中有关阶乘的算法

2008-03-05 10:10 316 查看
在面试中,对于阶乘方面有可能有两个算法,一个是求大数阶乘的问题,由于大数会超过整数的限值,所以需要使用数组的方法来实现:算法如下:
#include <stdio.h>
int main()
{

int n; //阶乘大小
printf("请输入n的大小:");
scanf("%d",&n); //从键盘接收阶乘大小
int a[200]; //确保保存最终运算结果的数组足够大
int carry; //进位
int digit = 1; //位数
a[0] = 1; //将结果先初始化为1
int temp; //阶乘的任一元素与临时结果的某位的乘积结果

for(int i = 2; i <= n; ++i) //开始阶乘,阶乘元素从2开始依次“登场”
{
//按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for(int j = 1, carry = 0; j <= digit; ++j)
{
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry) //如果有进位
{
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry /= 10; //看还能不能进位
}
}
printf("结果是:/n%d ! = ",n); //显示结果
for(int i = digit; i >=1; --i)
{
printf("%d",a[i-1]);
}
return 0;
}

在这个算法中,每个数组存放了一个小于10000的四位整数,也可存放1个整数、2个整数等。

关于求阶乘有多少个0的问题:
公式如下:n/5+ n/5*5+ n/5*5*5
算法如下:

int main()
{
int m,n,count;
m=n=count=0;
for(m=5;m<=500; m++)
{
n=m;
while(n%5==0)
{
n=n/5;
count++;
}
}
printf("%d/",count);
return 0;
}
==================================================================================

在面试中,对于阶乘方面有可能有两个算法,一个是求大数阶乘的问题,由于大数会超过整数的限值,所以需要使用数组的方法来实现:算法如下:
#include <stdio.h>

unsigned int result[10000];

#define N 100

int main(int arc, char** arg)

{

int i,j,k;

i=j=0;

k=1;

for(j=0; j<10000;
j++)

{

result[j]=0;

}

result[0]=1;

for( i=1; i<=N; i++)

{

for( j=0;
j<k; j++)

{

result[j]*=i;

}

for(j=0;
j<k; j++)

{

if(result[j]/10000>=1)

{

result[j+1]+=result[j]/10000;

result[j]= result[j]%10000;

if(j==k-1)

k++;

}

}

}

printf("%d",result[k-1]);

for(j=k-2; j>=0; j--)

printf("%04d",result[j]);

getchar();

return 0;

}

在这个算法中,每个数组存放了一个小于10000的四位整数,也可存放1个整数、2个整数等。

关于求阶乘有多少个0的问题:
公式如下:n/5+ n/5*5+ n/5*5*5
算法如下:

int main()
{
int m,n,count;

m=n=count=0;

for(m=5;m<=500; m++)

{

n=m;

while(n%5==0)

{

n=n/5;

count++;

}

}

printf("%d/n",count);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: