题解 洛谷P1207 【[USACO1.2]双重回文数 Dual Palindromes】

Sol

这道题我的做法比较暴力。

题目要求我们找到s个,因此我们可以枚举,直到有\(s\)个符合条件。

然后我们需要来考虑如何判断是否可行

我们仍然可以很暴力地来做!

我们枚举N进制,然后判断该数字在\(N\)进制下是否回文。

其实就是一个模拟?

Code

我先来帮大家理一理代码思路吧

首先我们要写一个进制转换的函数

我们还要写一个Check函数,用来判断当前数字是否可行。

主函数就会很简洁啦~

代码!代码中有简略注释!

#include<bits/stdc++.h>
using namespace std;
int Aim,Begin;
inline string Inverse(int N,int Aim_Base)//进制转换:转换为Aim_Base进制
{
	register string Return="";
	while(N)
	{
		Return+=N%Aim_Base+'0';
		N/=Aim_Base;
	}//简单转换
	register int i;
	for(i=0;i<Return.size()/2;i++)
	{
		swap(Return[i],Return[Return.size()-i-1]);
	}//倒序
	return Return;
}
inline bool Check(int N)
{
	register int Base_System;
	register int Sum=0;
	for(Base_System=2;Base_System<=10;Base_System++)
	{//题目中讲到:只可能是2~10进制
		register string String_N=Inverse(N,Base_System);//进制转换
		register int Left,Right;
		Left=0;
		Right=String_N.size()-1;
		register bool Flag=true;
		while(Left<Right)
		{
			if(String_N[Left]!=String_N[Right])
			{
				Flag=false;
			}
			Left++,Right--;
		}//检查是否回文
		if(Flag)
		{
			Sum++;
		}
	}
	return (Sum>=2)?true:false;
}
int main(void)
{//简洁的主函数
	register int i;
	cin>>Aim>>Begin;
	for(i=Begin+1;Aim;i++)
	{
		if(Check(i))
		{
			cout<<i<<endl;
			Aim--;//如果成立,那么我们就将剩下需要找的数量-1
		}
	}
	return 0;
}

Result

那么,我们这样的代码交上去能跑多快呢?!

大家可以康康!

效率还不赖!

跑得还不错嘛!

posted @ 2020-08-10 21:16  Bushuai_Tang  阅读(213)  评论(1编辑  收藏  举报