数据量不大,可以直接枚举。首先确定所需要的最小进制,然后从此处向62进行枚举。然后就是关于求摸的问题。不可能把整个数先求出来。因为数很大,根本存不下。根据求摸公式可得结果a1a2a3a4...a(s)%(n-1)=(a1+a2+...a(s)))%(n-1)
#include <iostream> #include <cstring> using namespace std; char s[40000]; int get(char a) { if(a>='0'&&a<='9') return a-'0'; else if(a>='A'&&a<='Z') return a-'A'+10; else return a-'a'+36; } int main() { while(cin>>s) { int i; int max=0,t; int len=strlen(s); for(i=0;i<len;i++) { t=get(s[i])+1; if(max<t) max=t; } int sum=0,j; for(j=0;j<len;j++) sum+=get(s[j]); for(i=max;i<=62;i++) { if(sum%(i-1)==0) { cout<<i<<endl; break; } } if(i>62) cout<<"such number is impossible!"<<endl; } return 0; }