@PaulGuan
2016-10-08T16:09:16.000000Z
字数 1045
阅读 836
算法 题解
定义一种新符号语言,遵循下面的转换法则,转换为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;}