题解 洛谷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
那么,我们这样的代码交上去能跑多快呢?!
大家可以康康!
跑得还不错嘛!
不要妄图追上西坠的太阳,而是要在黎明前就等着它!