Rex01
2025-01-09 22:07:51
给你一个
分步走:
处理输出
判断其初始时间是否合法,即小时的最大值
判断
处理所有的合法进制。将
#include <iostream>
#include <cmath>
using namespace std;
string s;
int l, z, z1, z2, hh[15], mm[15];
int cnt1, cnt2, f, h, m;
int Maxh = -1, Minh = 1e9 + 7;
int Maxm = -1, Minm = 1e9 + 7;
//定义一大堆变量爽了
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);//减少输入时间
cin >> s;
l = s.size();
for(int i = 0; i < l; i++)
if(s[i] == ':') z = i;//记录':'的位置
for(int i = 0; i < z; i++)
{
if(s[i] != '0'){z1 = i; break;}
if(i == z - 1) z1 = z - 1;
}
for(int i = z + 1; i < l; i++)
{
if(s[i] != '0'){z2 = i; break;}
if(i == l - 1) z2 = l - 1;
}
for(int i = z1; i < z; i++)
if(isdigit(s[i]))//isdigit(x)判断x是否为数字
{
int z = s[i] - '0';
Maxh = max(Maxh, z);
Minh = min(Minh, z);
hh[++cnt1] = z;
}
else if('A' <= s[i] && s[i] <= 'Z')
{
int z = s[i] - 'A' + 10;
Maxh = max(Maxh, z);
Minh = min(Minh, z);
hh[++cnt1] = z;
}
for(int i = z2; i < l; i++)
if(isdigit(s[i]))
{
int z = s[i] - '0';
Maxm = max(Maxm, z);
Minm = min(Minm, z);
mm[++cnt2] = z;
}
else if('A' <= s[i] && s[i] <= 'Z')
{
int z = s[i] - 'A' + 10;
Maxm = max(Maxm, z);
Minm = min(Minm, z);
mm[++cnt2] = z;
}
if(Maxh > 23 || Maxm > 59)
{//如果'时'最大超过23且'分'最大超过59
cout << "0" << endl;
return 0;//换行是个好习惯
}
if(cnt1 <= 1 && cnt2 <= 1)
{
cout << "-1" << endl;
return 0;//好习惯 * 2
}
f = max(Maxh, Maxm) + 1;
while(true)
{
int a = cnt1 - 1;
h = 0; m = 0;//h表示小时,m表示分钟
for(int i = 1; i <= cnt1; i++)
{
int z = pow(f, a);
h += z * hh[i]; a--;
//计算小时↑
}
a = cnt2 - 1;
for(int i = 1; i <= cnt2;i++)
{
int z = pow(f, a);
m += z * mm[i]; a--;
//计算分钟↑
}
if((h < 0 || h > 23) || (m < 0 || m > 59))
{//如果小时和分钟均不成立(我在说什么...)
if(f == max(Maxh, Maxm) + 1)
cout << "0" << endl;
break;//不加这行将会喜提TLE
}
else cout << f << " ";//按题目格式输出
f++;//别忘了每次输出完加1
}
return 0;
}
不抄题解,从我做起!别跟我说你没看见或者不识字。