题目链接:戳我戳我
我们知道, 的最后一位必定不是0, 则
的位数与
相等。
那么如何来求 的位数呢?
为了不失一般性, 在此直接讨论任意数 的位数:
对于任意大于等于0的实数k, 有 的位数为
+ 1(即k的向下取整再+1)
而
所以位数就是 啦
log10是cmath里的函数直接用就行
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[2600]; //其实开两倍就够了
int r[2600]; //这个是乘法的结果数组
void mul(int *a, int *b) //高精度乘法
{
memset(r, 0, sizeof(r));
for(int i = 0; i < 500; ++i)
{
int before = 0;
for(int j = 0; j < 500; ++j)
{
r[i + j] += a[i] * b[j] + before;
before = r[i + j] / 10;
r[i + j] %= 10;
}
if(before)
r[i + 500] += before;
}
}
void qp(int p) //高精度快速幂对500取模
{
int b[2600];
memset(b, 0, sizeof(b));
b[0] = 2;
while(p)
{
if(p & 1)
{
mul(a, b);
for(int i = 0; i < 500; ++i)
a[i] = r[i];
}
mul(b, b);
for(int i = 0; i < 500; ++i)
b[i] = r[i];
p >>= 1;
}
}
int main()
{
int p;
cin>>p;
int nima = (int)(p*log10(2)+1); //求位数nima(不要在意我帅气的变量名)
cout<<nima<<endl;
memset(a, 0, sizeof(a));
a[0] = 1;
qp(p);
a[0]--; //-1直接减就行喽
int sum = 0;
for(int i = 499; i>=0; --i)
{
sum++;
cout<<a[i];
if(sum % 50 == 0)
cout<<endl;
}
return 0;
}