• 麦基数(p1045)


    描述:
    (计算2^{P}−1的位数和最后500位数字(用十进制高精度数表示))

    Ⅰ.求位数

    (因为2^p最后一位必定不为0,求2^p-1的位数也就是求2^p位数)
    (2^p的位数确实很难求,但10^p我们是知道的,位数等于p+1)
    (为此我们可以采用换底公式,2=10的log10(2)次方)
    (所以答案就是求(int)(log10(2)*p+1)))

    接下来就是高精度快速幂了,只需要用每次的最后500位做乘法就好了

    #include <bits/stdc++.h>
    using namespace std;
    int p,a[1009],b[1009],temp[1009];
    void ji1()
    {
    	memset(temp,0,sizeof(temp));
    	for(int i=1;i<=500;i++)
    	for(int j=1;j<=500;j++)
    	{
    		temp[i+j-1]+=a[i]*b[j];
    		temp[i+j]+=temp[i+j-1]/10;
    		temp[i+j-1]%=10;
    	}
    	memcpy(a,temp,sizeof(temp));
    }
    void ji2()
    {
    	memset(temp,0,sizeof(temp));
    	for(int i=1;i<=500;i++)
    	for(int j=1;j<=500;j++)
    	{
    		temp[i+j-1]+=b[i]*b[j];
    		temp[i+j]+=temp[i+j-1]/10;
    		temp[i+j-1]%=10;
    	}
    	memcpy(b,temp,sizeof(temp));
    }
    int main()
    {
    	cin>>p;
    	cout<<int(log10(2)*p+1)<<endl;
    	a[1]=1;b[1]=2;
    	while(p)
    	{
    		if(p&1)	ji1();
    		p>>=1;
    		ji2();
    	}
    	a[1]-=1;
    	for(int i=500;i>=1;i--)
    	{
    		if(i%50==0&&i!=500)	cout<<endl<<a[i];
    		else	cout<<a[i];
    	}
    	return 0;
    }
    
  • 相关阅读:
    文件上传之断点续传方案
    WEB项目(B/S系统)打包安装(总结篇)
    FLEX4.0开发流媒体视频播放器(总结篇)
    mysql 从库出现system lock延迟
    mysql与oracle 不同
    操作系统运维查询命令
    centos ifconfig 命令找不到
    bit 与 byte的区别
    mysql 登录socket与TCP
    xhost +
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12620749.html
Copyright © 2020-2023  润新知