洛谷P1009 [NOIP1998 普及组] 阶乘之和经典解法

#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 10
int a[N], b[N], c[N];
void cpy(int* a, int* b) {
	for(int i=N-1;i>=0;i--)
		*(a+i) = *(b+i);
}
void sudoplus(int*p,int*q)//Add array from pointer q to array from pointer p.
{
	int i;
	for (i = 0; i < N; i++)
	{
		if (*(p+i)+*(q+i) < 100000000)
		{
			*(p + i) = *(p + i) + *(q + i);
		}
		else
		{
			(*(p+i+1))++;
			*(p + i) = *(p + i) + *(q + i) - 100000000;
		}
	}
}
void sudomultiply(int n)//Multiply array b n times.
{
	int i;
	void sudoplus(int*, int*);
	cpy(c, b);
	for (i = 0; i < n-1; i++)
	{
		sudoplus(b, c);
	}
}
void sudoprint(void)//Print array a in order.
{
	int i, flag;
	for (i = N - 1, flag = 0; i >= 0; i--)
	{
		if ((a[i] != 0) && (flag == 0))
		{
			printf("%d",a[i]);
			flag = 1;
			continue;
		}
		if (flag==1)
		{
			printf("%08d", a[i]);
		}
	}
}
int main(void)
{
	int n, i;
	void sudoplus(int*, int*);
	void sudomultiply(int);
	void sudoprint(void);
	b[0] = 1;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		sudomultiply(i);
		sudoplus(a,b);
	}
	sudoprint();
	return(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值