【进制】【CF】B. Martian Clock
题目意思:
火星上使用了一套表示时间的系统,这套系统和地球上时间表示系统是相似的。
给定一个火星时间,猜测\判断其进制类型(通过将火星时间转换成地球时间,该地球时间是否存在不合理的地方,如果没有,则说明在该进制下,火星时间是可行的)
若不存在任何进制,则输出0;
若任何进制都可以采取,则输出-1;
-
极端情况下,只需要判断一下60进制可不可以,一旦60进制可以,则说明小时和分钟部分都只存在个数(个数都是乘上进制的0次方,所以采取任何进制对结果没有任何影响)。
-
同时,在一个进制下,数字上的每一位上的数字是不能超过进制规定的最大数字的。
二分答案的不可行性:答案区域并不是从区间中的某一个点覆盖到一端。
#include <bits/stdc++.h>
#define ull unsigned long long
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
using namespace std;
string s,h,m;
bool check(int k)
{
int jud1 = 0,jud2 = 0;
rep(i,0,h.length())
{
int add=0;
if(h[i]>='A'&&h[i]<='Z')
add=h[i]-'A'+10;
else add=h[i]-'0';
if(add>=k)return false;
jud1=jud1*k+add;
}
rep(i,0,m.length())
{
nt add=0;
if(m[i]>='A'&&m[i]<='Z')
add=m[i]-'A'+10;
else add=m[i]-'0';
if(add>=k)return false;
jud2=jud2*k+add;
}
if( (jud1>=0 && jud1<24) && (jud2>=0 && jud2<60) )
return true;
return false;
}
int main()
{
cin>>s;
h = s.substr(0,s.find(':'));
m = s.substr(s.find(':')+1);
if(check(60)) cout<<-1;
else
{
bool flag=0;
repd(i,1,60)
if(check(i))
flag=1,cout<<i<<" ";
if(!flag) cout<<0;
}
return 0;
}