计算大数阶乘

#include<stdio.h>
#include<string.h>
int main (void)
{
	int N,sub,sub_a;
	int m,i,j,k,p;
	int res[500],a[500],b[500];
	scanf ("%d",&N);
	memset(res,0,sizeof(res));//储存结果 
	res[499]=1;//将输出结果先赋值为1  
	while (N) {
		memset(a,0,sizeof(a));//a是负责将阶乘中新的数放进去 
		memset(b,0,sizeof(b));//b是得出a和res得结果 
		m=N;
		i=499;
		//将m拆开 放入a数组 
		while (m) {
			a[i]=m%10;
			m=m/10;
			i--;
		}
		//sub为res最高位 
		for (i=0;i<500;i++) {
			if (res[i]!=0) {
				sub=i;
				break;
			}
		}
		//sub_a为a得最高位 
		for (i=0;i<500;i++) {
			if (a[i]!=0) {
				sub_a=i;
				break;
			}
		}
		p=499;
		k=499;
		//将a与res的乘积放入b 
		for (i=499;i>=sub_a;i--) {
			for (j=499;j>=sub;j--) {
				b[k--]+=(a[i]*res[j])%10;
				b[k]+=(a[i]*res[j])/10;
			}
			p--;
			k=p;
		}
		//b覆盖res 
		for (i=0;i<500;i++) {
			res[i]=b[i];
		}
		N--;
	}
	//找到最后的res最高位 
	for (i=0;i<500;i++) {
		if (res[i]!=0) {
			sub=i;
			break;
		}
	}
	//输出 
	for (i=sub;i<500;i++) {
		printf ("%d",res[i]);
	}
}

我将数组开到500,把所有位放0,将每个数拆分从右至做依次放入(还是按原顺序0)
关键代码为如何计算二者成绩,就是将两个多位数相乘按照竖式去计算,但计算时并不是满十进一,而是只取最低位个位放在位置上,其他高位全部进位到上一位,这样可以在两层循环时就搞定。
比如说我们计算111*11
正常竖式为:
11
*      111
------------
11
       11
      11
------------
      1221
我们的计算方法为:
11
*      111
------------
      1221

emmm,反正就是直接得111只保留个位1,下一个算出来是111加上前面进位得11就是1221。

                    ————我是太阳骑士索拉尔,愿太阳在你心中闪耀

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值