POJ1023 The Fun Number System
题目来源:http://poj.org/problem?id=1023
题目大意:
有一种有趣的数字系统。类似于我们熟知的二进制,区别是每一位的权重有正有负。(低位至高位编号0->k,第i位的权值为2^i 或-2^i)
输入:第一行给定测试用例数。每个用例的第一行为一个正整数k(1<=k<=64),说明该二进制编码的位数长度。接下来一行是一个长度为k的字符串,仅有两种字母p和n,描述了该种编码格式中每一位的权重为正(p)还是为负(n).第三行为一个正整数,N(-2^23<=N<=2^23)。
输出:对于N若能够用前述的编码方式编码,则输出其编码结果,若不能输出Impossible。
Sample Input
2 3 pnp 6 4 ppnn 10
Sample Output
Impossible 1110
按10进制转化为2进制的方法计算每位为0还是为1,若求完最后一位后,剩下的数字为0,则说明可以按该规则编码成功,否则不能。
1 ////////////////////////////////////////////////////////////////////////// 2 // POJ1023 The Fun Number System 3 // Memory: 304K Time: 0MS 4 // Language: C++ Result: Accepted 5 ////////////////////////////////////////////////////////////////////////// 6 7 #include <iostream> 8 #include <cmath> 9 10 using namespace std; 11 12 int main() { 13 int ncase; 14 cin >> ncase; 15 for (int caseNo = 1; caseNo <= ncase; ++caseNo) { 16 int k; 17 cin >> k; 18 char s[64]; 19 int v[64]; 20 for (int i = 0; i < k; ++i) { 21 cin >> s[i]; 22 } 23 long long n; 24 cin >> n; 25 for (int t = 0; t < k; ++t) { 26 long long base = (long long)pow(2.0, t+1.0); 27 if (n % base == 0) { 28 v[t] = 0; 29 } else { 30 v[t] = 1; 31 n -= (s[k - 1 - t] == 'p' ? ((long long)pow(2.0, t+0.0)) : -1 * ((long long)pow(2.0, t+0.0))); 32 } 33 } 34 if (n == 0) { 35 for (int t = k - 1; t >= 0; --t) { 36 cout << v[t]; 37 } 38 cout << endl; 39 } else { 40 cout << "Impossible" << endl; 41 } 42 43 } 44 system("pause"); 45 return 0; 46 }