用C语言求出一个较大整数n(n大于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;/*返回*/
}
温馨提示:答案为网友推荐,仅供参考
相似回答