ACdream 1038 Alien Numbers (模拟)

题目链接:
点击打开题目

题意:
看了 2 遍,居然还不知所云…再看几遍才知道说啥….英文阅读能力有点退化了呀…

其实就是进制转换。
拿第三个样例来说,
因为source_language 16 位,所以是个 16 进制。(十进制) 13 转换成 16 进制就是 19
"13"(alien_source)=1161+3160=16+3=1916
19 再转换成 01 (二进制)就是 124+121+120>10011
然后直接模拟就可以啦。

代码:

/*
* this code is made by LzyRapx
* Problem: 1038
* Verdict: Accepted
* Submission Date: 2017-06-06 14:23:15
* Time: 4MS
* Memory: 5592KB
*/
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e6+10;  
char s[MAXN], source[MAXN], target[MAXN], ans[MAXN];  
map<char, int> mps;  
map<int, char> mpt;  
long long q_pow(int n,int k)
{
    long long ans=1;
    while(k)
    {
        if(k&1) ans=ans*n;
        k>>=1;
        n=n*n;
    }
    return ans;
}
int main()  
{  
    int t, cas= 1;  
    cin>>t;
    getchar();  
    while(t--)  
    {  
        mps.clear();
        mpt.clear();  
        scanf("%s", s);  
        scanf("%s", source);  
        scanf("%s", target);
        int len1 = strlen(s);    
        int len2 = strlen(source);
        int len3 = strlen(target);  

        for(int i=0; i<len2; i++)  
        {  
            mps[source[i]] = i;  
        }  
        for(int i=0; i<len3; i++)  
        {  
            mpt[i] = target[i];  
        }  
        int res = 0;  
        for(int i=0; i<len1; i++)  
        {  
             res += q_pow(len2,i)*mps[s[len1-i-1]];
         //   cout<<"res="<<res<<endl;

        }  
   //  cout<<"res="<<res<<endl;
        if(res==0)  
        {  
            printf("Case #%d: ", cas++);  
            printf("%c\n", target[0]);  
            continue;  
        }  
        int cnt = 0;  
        while(res)  
        {  
            ans[cnt++] = mpt[(res%len3)];  
            res /= len3;  
        }  

        printf("Case #%d: ", cas++);  
        for(int i=cnt-1; i>=0; i--) cout<<ans[i];
        cout<<endl;
    }  
    return 0;  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值