啊,不允许一进制的存在,多么无害而致命的提示啊
这个题目的重点就是先判断有n个不重复的字符,那就是n进制,当n=1时,要修改为2,接着确定每个字符代表的数码,第一个出现的一定是1,第二个出现的是0,第三个出现的2,接着是3,4,5以此类推,确定了编码后,就是计算一个n进制的数的十进制表示了,python代码如下。
for k in range(int(input())):
print(‘case #’ + str(k) + ‘:’)
one_num = ‘’.join(input().strip())
if len(one_num) == 1:
print(1)
continue
num_set = []
for one_s in one_num:
if one_s not in num_set:
num_set.append(one_s)
len_num = len(num_set)
my_num = []
for i in range(len_num):
if i == 0:
my_num.append(1)
elif i == 1:
my_num.append(0)
else:
my_num.append(i)
num_k = dict(zip(num_set,my_num))
get_num = 0
len_one_num = len(one_num)
if len_num==1:
len_num = 2
for j in range(len_one_num):
exp_n = len_one_num -1 - j
exp_add = 1
for l in range(exp_n):
exp_add = exp_add*len_num
get_num += num_k[one_num[j]] * exp_add
print(get_num)
#include<bits/stdc++.h>
using namespace std;
void solve(string str) {
map<char, int> dict;
dict[str[0]] = 1;
int num = 2;
for(int i = 1; i < str.length(); ++i){
if(dict.find(str[i]) == dict.end()){
if(dict.size() == 1)
dict[str[i]] = 0;
else{
dict[str[i]] = num;
num++;
}
}
}
long long re = 0;
for(int i = str.length()-1, n = 0; i >= 0; --i, ++n){
re += dict[str[i]]*powl(num, n);
}
cout << re << endl;
}
int main() {
int num;
cin >> num;
cin.get();
for(int cas = 0; cas < num; ++cas){
string str;
getline(cin, str);
printf("case #d:\n", cas);
solve(str);
}
}
攻击oj真是人生乐趣,帮我看看哪里错了
int cmp(const voida,const voidb)
{
return (char)a-(char)b;
}
int main()
{ int i,t;
long long w[650]={0},x,a,b,q=1,z=1;
char s[650],p[650];
long long y=0;
scanf(“%d\n”,&t);
for (i=0;i<t;i++)
{ printf(“case #%d:\n”,i);
memset(s,0,sizeof(s));
memset(w,0,sizeof(w));
memset(p,0,sizeof(p));
z=1;
y=0;
scanf(“%s”,s);
x=strlen(s);
for(a=0;a<x;a++)
p[a]=s[a];
qsort(p,x,sizeof(p[0]),cmp);
for(a=1;a<x;a++)
if(p[a-1]!=p[a])
z++;
w[0]=1;
q=-1;
y+=w[0]pow(z,x-1);
for(a=1;a<x;a++)
{
for(b=0;b<a;b++)
{
if(s[a]==s[b])
{
w[a]=w[b];
break;
}
}
if(b==a)
{
q++;
if(q==1)
q++;
w[a]=q;}
y+=w[a]pow(z,x-a-1);
}
printf(“%I64d\n”,y);
}
return 0;
}
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=0;i>message;
int length=strlen(message);
int sum=0;
int digit[36];
memset(digit,-1,sizeof(digit));
int is_contain[36];
memset(is_contain,0,sizeof(is_contain));
int flag=1;
int MAX=1;
for(int j=0;j<length;++j)
{
if(j==0)
{
num[j]=1;
if(message[j]>='0'&&message[j]<='9'){
is_contain[message[j]-'0']=1;
digit[message[j]-'0']=1;
}
else
{
is_contain[message[j]-'a'+10]=1;
digit[message[j]-'a'+10]=1;
}
}
else if(j>0&&flag&&message[j]!=message[0])
{
num[j]=0;
flag=0;
if(message[j]>='0'&&message[j]<='9'){
is_contain[message[j]-'0']=1;
digit[message[j]-'0']=0;
}
else
{
is_contain[message[j]-'a'+10]=1;
digit[message[j]-'a'+10]=0;
}
}
else
{
if(message[j]>='0'&&message[j]<='9'){
if(is_contain[message[j]-'0'])
num[j]=digit[message[j]-'0'];
else
{
is_contain[message[j]-'0']=1;
num[j]=digit[message[j]-'0']=MAX+1;
MAX++;
}
}
else
{
if(is_contain[message[j]-'a'+10])
num[j]=digit[message[j]-'a'+10];
else
{
is_contain[message[j]-'a'+10]=1;
num[j]=digit[message[j]-'a'+10]=MAX+1;
MAX++;
}
}
}
//cout<<num[j]<<endl;
}
//cout<<MAX<<endl;
cout<<"case #"<<i<<':'<<endl;
long long ans=0;
for(int j=0;j<length;++j)
{
ans+=ans*MAX+num[j];
}
cout<<ans<<endl;
}
return 0;
}
为啥要另写一个pow啊……
x=(int)(pow(a,b)+0.5)
不就可以了吗……powl亲测可以