hdoj 1042 N!(还是对大数的处理)
2017-05-31 10:05
260 查看
初略估计10000!的阶乘会有将近3000位数。
用二维数组每个单元保存一位数最后会内存溢出,所以我们每个单元保存4位数,减少数组的大小。
注意输出时的细节,每个单元保存4位数,如果数是0的话,要以%04输出。
#include<stdio.h>
using namespace std;
#define M 10001
#define N 10001
int a
[M]={0};
int len
;
void change()
{
int i,j,l,r,temp;l=1;
a[0][0]=1;len[0]=1;
for(i=1;i<N;i++)
{
for(j=0;j<l;j++)
{
a[i][j]=a[i-1][j]*i;
}r=0;
for(j=0;j<l;j++)
{
temp=a[i][j]+r;
a[i][j]=temp%10000;
r=temp/10000;
}
while(r)
{
a[i][l++]=r%10000;
r=r/10000;
}
len[i]=l;
}
}
int main()
{
int n,i;
change();
while(~scanf("%d",&n))
{
if(len
==1) printf("%d\n",a
[0]);
else{
printf("%d",a
[len
-1]);
for(i=len
-2;i>=0;i--)
printf("%04d",a
[i]);
printf("\n");
}
}
return 0;
}
用二维数组每个单元保存一位数最后会内存溢出,所以我们每个单元保存4位数,减少数组的大小。
注意输出时的细节,每个单元保存4位数,如果数是0的话,要以%04输出。
#include<stdio.h>
using namespace std;
#define M 10001
#define N 10001
int a
[M]={0};
int len
;
void change()
{
int i,j,l,r,temp;l=1;
a[0][0]=1;len[0]=1;
for(i=1;i<N;i++)
{
for(j=0;j<l;j++)
{
a[i][j]=a[i-1][j]*i;
}r=0;
for(j=0;j<l;j++)
{
temp=a[i][j]+r;
a[i][j]=temp%10000;
r=temp/10000;
}
while(r)
{
a[i][l++]=r%10000;
r=r/10000;
}
len[i]=l;
}
}
int main()
{
int n,i;
change();
while(~scanf("%d",&n))
{
if(len
==1) printf("%d\n",a
[0]);
else{
printf("%d",a
[len
-1]);
for(i=len
-2;i>=0;i--)
printf("%04d",a
[i]);
printf("\n");
}
}
return 0;
}
相关文章推荐
- HDOJ-1042 大数处理时的更优方法
- HDOJ 1042 N! (大数)
- HDOJ1042 N!(大数阶乘)
- HDOJ 1042 N!(大数阶乘JAVA)
- ACM--大数阶乘--HDOJ 1042--N!--Java
- HDOJ1013大数处理
- HDOJ-1042-N!求解,大数乘法
- HDOJ2054(大数处理)
- HDOJ 1042 N! (大数阶乘)
- hdoj 1042 N! 【大数阶乘】
- hdoj1002 A + B Problem II(简单的大数处理)
- 求 n! (大数问题)----------HDOJ1042
- HDOJ 题目1042 N!(大数)
- 大数乘法-HDOJ1042
- hdoj1042(N!,大数乘)
- HDoj-1042 大数阶乘
- HDOJ-1042 大数阶乘[JAVA大数]
- [HDOJ 1042] N! [java大数]
- 大数阶乘模板 hdoj1042
- HDU 1042 N! (大数阶乘,紫书上的方法超时!!还是Java大法好!!)