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

展开全部

题目中数据很大

于是我们有了高精度算法

思路是什么呢:

一个数组里面每一位存的是十进制数三位(也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;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值