3053. 神秘信息

10154601131

啊,不允许一进制的存在,多么无害而致命的提示啊

beginning.

首位不能是0……竟然只有一位的时候也不能是0[\吐血]

10175101103-STARK

需要注意的是powx参数和返回值是double,会有精度问题,要自己另外写一个pow
还有因为没有一进制所以00000之类的要单独当二进制处理。。

10175102262 LarsPendragon

为啥要另写一个pow啊……x=(int)(pow(a,b)+0.5)不就可以了吗……

Canis

powl亲测可以

10152130230

攻击oj真是人生乐趣,帮我看看哪里错了

include

include

include

include

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;
}

10152130230

3053
[em:01]

10175102262 LarsPendragon

把printf的%LLd换成%lld就过了是什么操作

爱丽丝_青贝尔克

如果从低位到高位一路pow过去好像会出精度问题。。。

功夫橘猫

include

include

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;

}

会奔跑的bug

这个题目的重点就是先判断有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)

Coriolis

“不允许一进制的存在”需要深刻准确地理解这句话的含义

徐摆渡

此题坑点:
1.答案开ll
2.不允许一进制,手动调成二进制

Canis
#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);
    }
}
SNORLAX

以为数码就是0-9中的一个数……最后发现不是……

LzQuarter

幸好没有负数的可能= =

你当前正在回复 博客/题目
存在问题!