@PaulGuan
        
        2016-10-08T16:09:16.000000Z
        字数 1045
        阅读 829
    算法 题解
定义一种新符号语言,遵循下面的转换法则,转换为2进制的(1000)2到(1111)2。
">"  →  1000,
"<"  →  1001,
"+"  →  1010,
"-"  →  1011,
"."  →  1100,
","  →  1101,
"["  →  1110,
"]"  →  1111.
将输入的字符代码按对应法则转换为2进制数字,再输出其10进制。
我们知道每一个16进制的个位数对应一个2进制的1-4位数,那么,我们可以用16进制数作为2进制和10进制的中转。注意求幂过程中的取模,如果不及时取模可能会溢出。
#include <iostream>#include <string>#include <vector>using namespace std;string a;vector <long long> num;long long qkpow(long long a,long long b){long long r=1,base=a;while(b!=0){if(b&1)r=(r*base)%1000003;base=(base*base)%1000003;b>>=1;}return r%1000003;}long long solve(void){int i;long long sum=0;for(i=0;i<a.size();i++){sum+=(num[i]*qkpow(16,i))%1000003;sum=sum%1000003;}sum=sum%1000003;return sum;}int main(void){cin>>a;int i;for(i=0;i<a.size();i++){switch(a[i]){case '>':num.insert(num.begin(),8);break;case '<':num.insert(num.begin(),9);break;case '+':num.insert(num.begin(),10);break;case '-':num.insert(num.begin(),11);break;case '.':num.insert(num.begin(),12);break;case ',':num.insert(num.begin(),13);break;case '[':num.insert(num.begin(),14);break;case ']':num.insert(num.begin(),15);break;}}cout<<solve()<<endl;return 0;}