c语言中阶乘相加怎么表示_c语言求阶乘累加和

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-23 05:57   292   0

展开全部

题目中数据很大

于是我们有了高精度算法

思路是什么呢:

一个数组里面每一位存的是十进制数三位(也62616964757a686964616fe58685e5aeb931333363383433可以只存一位,但是比较慢)

也可以理解成一千进制

这样能模拟大整数的乘法、加法#include

#include

#define max(a,b) (a>b?a:b)

int n;

FILE * input, * output;

struct bigint

{

int len;

int num[1100];

}fac,sum;

void mul(int value){//高精度乘单精度

int i;

for (i=1;i<=fac.len;i++)

fac.num[i]=fac.num[i]*value;//每个数位乘上数

for (i=1;i<=fac.len;i++)

if (fac.num[i]>=1000) {//逢千进一

fac.num[i+1]+=fac.num[i]/1000;fac.num[i]%=1000;

}

if (fac.num[fac.len+1]) fac.len++;//位数可能会增加,而且最多增加1

}

void add()//给sum加上fac的值

{

int i;

//由于此时fac永远大于sum所以不用判断sum的长度

for (i=1;i<=fac.len;i++)

sum.num[i]+=fac.num[i];//每一位加上fac的值

for (i=1;i<=fac.len;i++)

if (sum.num[i]>=1000){//逢千进一

sum.num[i+1]++;sum.num[i]-=1000;//因为加法运算不可能往前进2

}

sum.len =fac.len;

if (sum.num[sum.len+1]) sum.len++;

}

void out()//输出

{

int i;

for (i=sum.len;i>=1;i--)

{

if (i

{//因为如果不是第一位,其他要补0,因为如果这个数是1001,就会变成11

if (sum.num[i]<10) fprintf(output,"00");

else if (sum.num[i]<100) fprintf(output,"0");

}

fprintf(output,"%d",sum.num[i]);

}

fputc('\n',output);

}

int main(){

input = fopen("factor.in","r");

output = fopen("factor.out","w");

memset(fac.num,0,sizeof fac.num);

memset(sum.num,0,sizeof sum.num);

fscanf(input,"%d",&n);

int i;

fac.len = sum.len = 1;//初始赋成1

fac.num[1] = sum.num[1] = 1;

for (i=2;i<=n;i++)

{

mul(i);

add();

}

out();

fclose(input);fclose(output);

return 0;

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP