luogu 1045 麦森数

题目大意:

从文件中输入P1000<P<3100000),计算2^P1的位数和最后500位数字(用十进制高精度数表示)

思路:

一道高精度练习题

其中位数是一个结论 位数=[P*log2]+1

然后就是高精度,因为作死的压位打了好久

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #define inf 2139062143
10 #define ll long long
11 #define MAXN 6010
12 #define MOD 10000
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 int n;
22 struct bign
23 {
24     int len,num[125];
25     bign(){len=0;memset(num,0,sizeof(num));}
26     void Print()
27     {
28         for(int i=124;i>0;i--)
29             if(i%25==12) printf("%02d\n%02d",num[i]/100,num[i]%100);
30             else if(i%25==0) printf("%04d\n",num[i]);
31             else printf("%04d",num[i]);
32         printf("%04d",num[0]-1);
33     }
34 };
35 bign mul(bign a,bign b)
36 {
37     bign res;int t;
38     //cout<<"a: ";a.Print();cout<<"b: ";b.Print();
39     for(int i=0;i<=a.len;i++)
40         for(int j=0;j<=b.len;j++)
41         {
42             t=a.num[i]*b.num[j];
43             if(i+j<=124) 
44                 if(i+j<124) res.num[i+j]+=t,res.num[i+j+1]+=res.num[i+j]/MOD,res.num[i+j]%=MOD;
45                 else res.num[i+j]+=t,res.num[i+j]%=MOD;
46         }
47     for(int i=0;i<=124;i++)
48         if(res.num[i]) res.len=i;
49     return  res;
50 }
51 void q_pow()
52 {
53     bign ans,t;ans.num[0]=1,t.num[0]=2;
54     while(n)
55     {
56         if(n&1) ans=mul(ans,t);
57         t=mul(t,t);
58         n>>=1;
59     }
60     ans.Print();
61 }
62 int main()
63 {
64     n=read();
65     printf("%d\n",(int)(n*0.30103)+1);
66     q_pow();
67 }
View Code

 

posted @ 2018-01-25 13:57  jack_yyc  阅读(139)  评论(0编辑  收藏  举报