C或者C++怎么求100的阶乘(代码)
C或者C++怎么求100的阶乘(代码)
追问:我是100的阶乘啊!int能存的下吗?
C或者C++怎么求100的阶乘(代码)
追问:我是100的阶乘啊!int能存的下吗?
答案:方法很多,给一个最好理解的使用数组保存100阶乘
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int calc(unsigned int n);/*计算N的阶乘,返回第一位非零数字*/
int count=0;//记录有多少个0
int main(void)
{
int i;
i=calc(100);//最大可以求5000的阶乘
cout<<"最后0的个数:"<<count<<endl;
cout<<"第一个不为0的数是:"<<i<<endl;
system("PAUSE");
return 0;
}
int calc(unsigned int n)/*注意,返回的是第一个非零数字*/
{
const int max = 10000;/*数组中每个元素存储的数据不超过max*/
int array[5000];/*用该个数组存储数据*/
int arrayNow = 0;/*标记数组用到了第几位*/
unsigned int num=1;/*计算阶乘用*/
int first=0;/*用于记录首个非零数*/
int i,j,temp;
int left;/*进位相加数*/
char out[8];
memset(array,0,5000*sizeof(int));/*初始化数组*/
if(n<3)/*小于3就不计算了*/
{
return n;
}
if(n>5000)
{
return -1;
}
array[0] = 1;
while(num<=n)//写入阶乘到数组
{
left = 0;/*第0位没有上一位进位*/
for(i=0;i<=arrayNow;i++)/*有记录的数组位置都需要乘num*/
{
temp = array[i]*(int)num;/*当前数组元素与num相乘*/
temp+=left; /*加上上一个元素的进位*/
array[i] = temp%max;/*记录当前元素*/
left = temp/max;/*记录进位*/
if(num==n && 0 == first && array[i]!=0)/*最后一趟乘法时进行查找第一个非零数字*/
{
temp = array[i];
while(0 == first)/*找当前元素的非零数字*/
{
first=temp%10;
temp/=10;
}
}
}
if(left>0)/*填充新位*/
{
array[++arrayNow] = left;
}
num++;
}
for(j=0;j<=n;j++)//计算0的个数
{
int a=0,b=array[j];
if(array[j]==0)
count+=4;
else
do
{
a=b%10;
if(a==0)
{
count++;
b=b/10;
}
else
break;
}
while(a%10==0);
if(a!=0)break;
}
for(i=arrayNow;i>=0;i--)
{
if(array[i]>=max)
{
printf("出错\n");
return -1;
}
if(i==arrayNow)
{
printf("%d",array[i]);
}
else
{
printf("%d",array[i]/1000);
printf("%d",array[i]/100 - (array[i]/1000)*10);
printf("%d",(array[i]%100)/10);
printf("%d",array[i]%10);
}
}
printf("\n");
return first;/*返回*/
}给你一个函数,应该能看懂吧
long factorial(int n) {
int a=1;int i;
for(i=1;i<=n;i++) a*=i;
return a;
}