1316 你能知道这是几进制数?
题目描述
有个比较特别的随机数生成器,你输入一个十进制数N,他会生成一个0到N-1之间的M进制数,但是你不知道这是一个M进制数,问你能猜测这是几进制数,升序输出所有的可能?
输入要求
第一行一个N(1< N < 10^9),代表输入的十进制数,第二行是一个小于10位的数(字符串表示),每个数位由0-9,a-z,A-Z表示0-61.所以最大进制就是62。
输出要求
输出一行,升序输出所有可能的进制可能(数字表示,每两个进制之间空格隔开,最后没空格),如果没有一种进制可能,输出“Machine is broken”。
测试数据
//输入
100
5e
//输出
15 16 17
AC代码
也是比较坑的题目了= =
- 注意算进制数的时候要用long long int(_int64),int会爆掉
#include <bits/stdc++.h>
using namespace std;
long long int find(string s,int n)
{
long long int res=0,num=1,temp;
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]>='A' && s[i]<='Z') temp=s[i]-'A'+36;
if(s[i]>='a' && s[i]<='z') temp=s[i]-'a'+10;
if(s[i]>='0' && s[i]<='9') temp=s[i]-'0';
res+=num*temp;
num=num*n;
}
return res;
}
int main() {
int n,mmax=-1,f=0;
string s;
cin>>n;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='A' && s[i]<='Z')
{
if(s[i]-'A'+36>mmax) mmax=s[i]-'A'+36;
}
if(s[i]>='a' && s[i]<='z')
{
if(s[i]-'a'+10>mmax) mmax=s[i]-'a'+10;
}
if(s[i]>='0' && s[i]<='9')
{
if(s[i]-'0'>mmax) mmax=s[i]-'0';
}
}
if(mmax<=1) mmax=1;//有没有这句话都能ac,我认为没有1进制,所以我加了
for(int i=mmax+1;i<63;i++)
{
if(find(s,i)<n)
{
if(f) cout<<" ";f=1;
cout<<i;
}
}
if(f==0) cout<<"Machine is broken";
cout<<endl;
return 0;
}