做题小结---进制专题

第一个是进制转换的问题 十进制转换n进制

进制转化最需要明白的就是这个图了

得到的数字再取反就是转化的数字了 先取余后除就行了
牛客 周赛刚好考了这个

	cin>>n>>k;
	if(k==1){
		cout<<1<<endl;return ;
	}
	int temp=1;
    int ans=0;
	while(temp<=n/k)temp*=k;
     while(n)
	 {
		 if(temp==0)break;
		 ans=max(ans,n/temp);
		 n%=temp;
		 temp/=k;
	 }
	cout<<ans<<endl;

进制的好题了 考的很好


这题很有思维难度 首先我们可以想到2个k 从一个k入手 一个k满足的 再看另一个k是否满足 这种检测的时间复杂度
是Ologk(n)是很小的 然后关键在于数字的统计 很明显有n位那就是2的n次方种 这么一看时间好大要超了

其实不然 题目限定了long long范围 再是k的指数递增很快 某一时刻那个数字下次再进位大于1e18了 我们就该结束了

对于k为3的情况 请多来到30多次 2的30多次方还是不会超时的 所以代码就这么简单写出来了 非常巧妙

	for(int i=0;i<=60;i++)
	{
		int add=qpow(k1,i);
		for(auto j:v)
		{
		q.push(j+add);
		if(check(j+add)&&j+add>1){
			cout<<"YES"<<endl;
			cout<<j+add<<endl;return ;
		}
		}
		while(q.size()){
		  v.push_back(q.front());q.pop();
		}
//		if(add*k1>1e18)break;//别这样写 会炸掉的
		if(k1>(1e18/add))break;
这一步很有灵魂
	}
	if(k1>(1e18/add))break;这一步很重要 一定要改变书写习惯

检查的代码 这一步模仿的就是 转进制的步骤


bool check(int x)
{
	int w=x%k2;
	if(x==1||x==0)return 1;
	if(w==0||w==1){
		return check(x/k2); 
	}
	else return 0;	
}

于是就写完了

posted @ 2024-09-08 18:53  LteShuai  阅读(32)  评论(0)    收藏  举报