P1045 麦森数

P1045 [NOIP2003 普及组] 麦森数

P1045 麦森数

输入n,求出 2 p − 1 2^p-1 2p1 位数和500个尾数

思路

运用对数转换 n ∗ ( l o g 10 ( 2 ) ) + 1 n*(log10(2))+1 n(log10(2))+1 即位数。

只需要保留后500,可以用一个数组,不断更新。初始化数组 a [ 0 ] = 1 , 其余为 0 a[0]=1,其余为0 a[0]=1,其余为0.

2 很特殊,可以直接用 <<

  • 左移P,数据溢出
  • 每次移动小,时间复杂度高

所以,每次移动10位,可以避免这个问题(换成其他也可以)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int a[550]={1};
signed main()
{
	IOS
	int n;
	cin>>n;
	int p=n*(log10(2))+1;
	cout<<p<<'\n';
	for(;n>0;n-=10)
	{	int f=0;
		int h=min(n,(long long)10);
		for(int i=0;i<=499;i++)
		{
			a[i]<<=h;
			a[i]+=f;
			f=a[i]/10;
			a[i]%=10;
		}
	}
	a[0]-=1;
	for(int i=1;i<=10;i++)
	{
		for(int j=549-50*i;j>499-50*i;j--)
		{
			cout<<a[j];
		}cout<<'\n';
	}	
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值