您的位置:首页 > 其它

51Nod 1057 N的阶乘

2017-09-02 19:46 204 查看
题目链接

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: