您的位置:首页 > 其它

【算法】大数阶乘的实现。读入一个自然数N,将N的阶乘结果数值的每一位数字相加,返回相加之和。

2018-09-10 15:35 330 查看
//
// Created by on 9/10/2018.
// 大数阶乘的实现.
//

#include <iostream>
#include <math.h>

void carryme(int bit[],int pos)
{
int i,carrayou = 0;
//
for(i = 0; i <= pos; i++)     //
{
bit[i] += carrayou;         //
//
if(bit[i] <= 9)           //
//
carrayou = 0;
else if(bit[i] > 9 && i < pos) //
{
//
carrayou = bit[i]/10;   //
//
bit[i] = bit[i]%10;   //
}
//
else if(bit[i] > 9 && i >= pos) //
{
//
while(bit[i] > 9)     //
{
//
carrayou = bit[i]/10; //
//
bit[i] = bit[i]%10; //
//
i++;
//
bit[i] = carrayou;
}
}
}
}
int BigBigDataDataFactorial()
{
int num,pos,digital,i,j;
//
double sum = 0;
//
int *fact;
//
scanf("%d",&num);

for(i = 1; i <= num; i++)
sum += log10(i);
//
digital = (int)sum + 1;
//
if(!(fact = (int*)malloc((digital+1)*sizeof(int))))
{
//
return 0;
}
//
for(i = 0; i <= digital; i++)
fact[i] = 0;
fact[0] = 1;
//
for(i = 2; i <= num; i++)
{
//
for(j = digital; j >= 0; j--)
{
//
if(fact[j] != 0)
{
pos = j;
break;
//
}
}
for(j = 0; j <= pos; j++)
fact[j] *= i;
carryme(fact,pos);
}

//
for(j = digital; j >= 0; j--)
if(fact[j] != 0)
{
pos = j;
break;
}
int res=0;
//
for(i = pos; i >= 0; i--)
{
res += fact[i];
}
//
printf("%d",res);

return 1;
}

int main()
{
BigBigDataDataFactorial();
}

参考

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐