1316 你能知道这是几进制数?

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;
}
原文地址:https://www.cnblogs.com/xxhao/p/14321964.html