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 }
View Code
posted @ 2013-07-31 19:25  小菜刷题史  阅读(550)  评论(0编辑  收藏  举报