【进制】【CF】B. Martian Clock

image

题目意思:

火星上使用了一套表示时间的系统,这套系统和地球上时间表示系统是相似的。

给定一个火星时间,猜测判断其进制类型(通过将火星时间转换成地球时间,该地球时间是否存在不合理的地方,如果没有,则说明在该进制下,火星时间是可行的)

若不存在任何进制,则输出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;
}

原文地址:https://www.cnblogs.com/BeautifulWater/p/15193824.html