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