[关闭]
@PaulGuan 2016-10-08T16:09:16.000000Z 字数 1045 阅读 630

N - Unary 题解

算法 题解


题目大意

定义一种新符号语言,遵循下面的转换法则,转换为2进制的(1000)2到(1111)2。
">"  →  1000,
"<"  →  1001,
"+"  →  1010,
"-"  →  1011,
"."  →  1100,
","  →  1101,
"["  →  1110,
"]"  →  1111.
将输入的字符代码按对应法则转换为2进制数字,再输出其10进制。

分析

我们知道每一个16进制的个位数对应一个2进制的1-4位数,那么,我们可以用16进制数作为2进制和10进制的中转。注意求幂过程中的取模,如果不及时取模可能会溢出。

代码

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5. string a;
  6. vector <long long> num;
  7. long long qkpow(long long a,long long b)
  8. {
  9. long long r=1,base=a;
  10. while(b!=0)
  11. {
  12. if(b&1)
  13. r=(r*base)%1000003;
  14. base=(base*base)%1000003;
  15. b>>=1;
  16. }
  17. return r%1000003;
  18. }
  19. long long solve(void)
  20. {
  21. int i;
  22. long long sum=0;
  23. for(i=0;i<a.size();i++)
  24. {
  25. sum+=(num[i]*qkpow(16,i))%1000003;
  26. sum=sum%1000003;
  27. }
  28. sum=sum%1000003;
  29. return sum;
  30. }
  31. int main(void)
  32. {
  33. cin>>a;
  34. int i;
  35. for(i=0;i<a.size();i++)
  36. {
  37. switch(a[i])
  38. {
  39. case '>':
  40. num.insert(num.begin(),8);
  41. break;
  42. case '<':
  43. num.insert(num.begin(),9);
  44. break;
  45. case '+':
  46. num.insert(num.begin(),10);
  47. break;
  48. case '-':
  49. num.insert(num.begin(),11);
  50. break;
  51. case '.':
  52. num.insert(num.begin(),12);
  53. break;
  54. case ',':
  55. num.insert(num.begin(),13);
  56. break;
  57. case '[':
  58. num.insert(num.begin(),14);
  59. break;
  60. case ']':
  61. num.insert(num.begin(),15);
  62. break;
  63. }
  64. }
  65. cout<<solve()<<endl;
  66. return 0;
  67. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注