51Nod_1116 K进制下的大数
http://www.51nod.com/Challenge/Problem.html#!#problemId=1116
题目
有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数在K进制下是K - 1的倍数。现在由你来求出这个最小的进制K。例如:给出的数是A1A,有A则最少也是11进制,然后发现A1A在22进制下等于4872,4872 mod 21 = 0,并且22是最小的,因此输出k = 22(大数的表示中A对应10,Z对应35)。
输入
输入大数对应的字符串S。S的长度小于10^5。
输出
输出对应的进制K,如果在2 - 36范围内没有找到对应的解,则输出No Solution。
样例输入
A1A
样例输出
22
分析
先找出至少是多少进制,然后向上枚举即可。
C++程序
#include<iostream>
#include<string>
using namespace std;
int f(char c)
{
int val=0;
if('0'<=c&&c<='9')
val=c-'0';
else if('A'<=c&&c<='Z')
val=c-'A'+10;
return val;
}
int main()
{
string s;
cin>>s;
char be='1';
for(int i=0;i<s.length();i++)
be=max(be,s[i]);
int begin;
if('0'<=be&&be<='9')
begin=be-'0'+1;
else if('A'<=be&&be<='Z')
begin=be-'A'+11;
int flag=false;
for(int i=begin;i<=36;i++)
{
long long ans=0;
for(int j=0;j<s.length();j++)
ans=(ans*i+f(s[j]))%(i-1);
if(!ans)
{
flag=true;
cout<<i<<endl;
break;
}
}
if(!flag)
cout<<"No Solution"<<endl;
return 0;
}