ACdream 1038 Alien Numbers (模拟)

xiaoxiao2021-02-27  274

题目链接: 点击打开题目

题意: 看了 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; }
转载请注明原文地址: https://www.6miu.com/read-9239.html

最新回复(0)