51Nod 1057 N的阶乘
2017-09-02 19:46
204 查看
题目链接
按照正常的做法,一个位一个位乘
1*2=2*3=6*4=24.。。。
这个方法最后一个点超时。之前我在oj上提交是通过的。要注意一点就是
求出来的fz有可能会非常非常非常大,大的超过数据范围
所以求出来fz要对fz进行分解
超时!!!
既然一个数一个数相乘,那么也可以两个两个相乘
例如
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;
}
按照正常的做法,一个位一个位乘
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;
}
相关文章推荐
- 51Nod 1057 N的阶乘(模拟进制&进位)
- 51NOD 1057 N的阶乘
- 51Nod 1057 N的阶乘
- 51Nod 1057 N的阶乘(数论)
- 51Nod-1057 N的阶乘
- 51nod 1057 N的阶乘
- 51Nod-1057-N的阶乘
- 51nod 1057 N的阶乘
- 大数阶乘(10000级别) 51Nod 1057
- 51nod 1057 N的阶乘 (水题ing……)
- 51nod 1057 N的阶乘
- 51nod_1057 N的阶乘(大数)
- 51nod 1057 N的阶乘
- 51nod 1057 N的阶乘
- 51nod 1057 N的阶乘(大数-划分)
- 51Nod-1057-N的阶乘
- 51nod 1003 阶乘后面0的数量
- 【51nod】1008 N的阶乘 mod P
- 【51Nod 1189】阶乘分数
- 51nod 1435:位数阶乘