满意答案
sniper木木
2013.04.09
采纳率:45% 等级:12
已帮助:4438人
方法1: 递归、循环、楼上的说的很详细了
方法2: 高精度+二分
下附法2的程序,大概在x=5000时可以1s跑出(我的7年老电脑上。。。)
你的机子肯定能跑更大的。。。
结果的位数如果不够在maxn那里改,不过谁也算不出1000w位吧,应该够了。。。
在文件"hello.in"中输入,输出在"hello.out"
#include
#define maxn 10000000
#define max(a,b) a>b?a:b
int x,a[maxn],b[maxn],o;
int ans[maxn],p;
int s3[maxn];
void Mult(int s1[],int *l1,int s2[],int l2)
{
int i,j;
for(i=1; i<=*l1+l2+2; i++) s3[i]=0;
for(i=1; i<=*l1; i++) for(j=1; j<=l2; j++) s3[i+j-1]+=s1[i]*s2[j];
j=*l1+l2-1;
for(i=1; i<=j; i++) if(s3[i]>9)s3[i+1]+=s3[i]/10,s3[i]%=10,j=max(j,i+1);
for(i=1; i<=j; i++) s1[i]=s3[i];
*l1=j;
}
void Init(void)
{
int i,j=0,k; i=x; p=1; ans[1]=1;
for(;i;i=i>>1) a[++j]=i&1;
while(x) b[++o]=x%10,x/=10;
for(i=j; i; i--)
{
Mult(ans,&p,ans,p);
if(a[i]) Mult(ans,&p,b,o);
}
for(i=p; i>=1; i--) printf("%ld",ans[i]); printf("\n");
}
int main(void)
{
freopen("hello.in","r",stdin);
freopen("hello.out","w",stdout);
scanf("%ld",&x);
Init();
return 0;
}
00分享举报