51Nod 1057 N的阶乘

题目链接

按照正常的做法,一个位一个位乘

1*2=2*3=6*4=24.。。。

这个方法最后一个点超时。之前我在oj上提交是通过的。要注意一点就是

求出来的fz有可能会非常非常非常大,大的超过数据范围

所以求出来fz要对fz进行分解

超时!!!

#include<stdio.h>
int main(){
	int a[9000000] = { 0 }; a[0] = 1;
	int s, n = 1;
	scanf("%d", &s);
	for (int i = 2; i <= s; i++){
		int fz = 0;
		for (int j = 0; j < n; j++){
			int p = a[j] * i;
			a[j] = (fz + p) % 10;
			fz = (fz + p) / 10;
		}
		int f = n;
		while (fz){
			a[f] = fz % 10;
			fz /= 10;
			f++;
		}
		n = f;
		//printf("%d!=",i);
		//for (int i = pd(a) - 1; i >= 0; i--)
		//	printf("%d", a[i]);
		//printf("\n");
	}
	for (int i = n - 1; i >= 0; i--)
		printf("%d", a[i]);
	return 0;
}

既然一个数一个数相乘,那么也可以两个两个相乘
例如
142
*   6
------
1:
42*6=252>100  保留52,进位2
2:
然后计算1*6+2=9 最后结果952


跟一个一个乘的原理一样:
1:
2*6=12>10 保留2,进位1

2:

4*6+1=25>10 保留5,进位2

3:

1*6+2=9<10 保留9,进位0

最后结果925

只不过这里对数据进行划分乘,避免超时


这里的r也就是上面的fz就不需要在划分了,一个数再大除以100000000也能存下了

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
	int n;
	static long long a[10000000];
	a[0]=1;
	cin>>n;
	int len=1;
	for(int i=2;i<=n;i++){
		long long r=0;
		for(int j=0;j<len;j++){
			long long fz=a[j]*i+r;
			a[j]=fz%100000000;
			r=fz/100000000;
		}
		if(r!=0) a[len++]=r;
	} 
	printf("%lld",a[len-1]);
	for(int i=len-2;i>=0;i--) printf("%08lld",a[i]);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值