[关闭]
@sensitive-cs 2016-10-19T08:32:09.000000Z 字数 1396 阅读 733

B - Ternary Logic

分析:

有一种运算规则,存在a和b两个数,a的第i位与b的第i位相加,所得的结果对3取余就是c的第i位,现在给出a和c,求出b。

思路:

将a和c转化为3进制数然后用字符串保存。
对a和c的每一位,如果a和c的第i位是相同的,那么b的第i位是0;如果a的第i位大于c的第i位,那么b的第i位就等于a的第i位减去c的第i位;若a的第i位小于c的第i位,那么b的第i位就等于a的第i位加上3减去c的第i位。
当c的位数大于a,那么c超出a的位数的数全部等于b对应的位数的数;当a的位数大于c,那么对于a比c多出的位数,如果存在0,则b的对应位数的的数等于0,不存在0的话,那么b对应的位数的数等于3-a的此位上的数。然后将b所对应的三进制数转化为10进制输出。

代码:

  1. #include <stdio.h>
  2. #include <math.h>
  3. char a[30];
  4. char c[30];
  5. char b[30];
  6. int main()
  7. {
  8. long long result = 0,x,y;
  9. int i = 0,j = 0,m;
  10. scanf("%I64d%I64d",&x,&y);
  11. while (x != 0)
  12. {
  13. a[i] = x % 3;
  14. x /= 3;
  15. i++;
  16. }
  17. while (y != 0)
  18. {
  19. c[j] = y % 3;
  20. y /= 3;
  21. j++;
  22. }
  23. if (j == i)
  24. {
  25. for (m = 0;m < j;m++)
  26. {
  27. if (c[m] == a[m])
  28. b[m] = 0;
  29. if (c[m] == 0 && a[m] == 1)
  30. b[m] = 2;
  31. if (c[m] == 0 && a[m] == 2)
  32. b[m] = 1;
  33. if (c[m] == 1 && a[m] == 0)
  34. b[m] = 1;
  35. if (c[m] == 1 && a[m] == 2)
  36. b[m] = 2;
  37. if (c[m] == 2 && a[m] == 0)
  38. b[m] = 2;
  39. if (c[m] == 2 && a[m] == 1)
  40. b[m] = 1;
  41. }
  42. }
  43. else if (j > i)
  44. {
  45. for (m = 0;m < i;m++)
  46. {
  47. if (c[m] == a[m])
  48. b[m] = 0;
  49. if (c[m] == 0 && a[m] == 1)
  50. b[m] = 2;
  51. if (c[m] == 0 && a[m] == 2)
  52. b[m] = 1;
  53. if (c[m] == 1 && a[m] == 0)
  54. b[m] = 1;
  55. if (c[m] == 1 && a[m] == 2)
  56. b[m] = 2;
  57. if (c[m] == 2 && a[m] == 0)
  58. b[m] = 2;
  59. if (c[m] == 2 && a[m] == 1)
  60. b[m] = 1;
  61. }
  62. for (m = i;m < j;m++)
  63. b[m] = c[m];
  64. }
  65. else
  66. {
  67. for (m = 0;m < j;m++)
  68. {
  69. if (c[m] == a[m])
  70. b[m] = 0;
  71. if (c[m] == 0 && a[m] == 1)
  72. b[m] = 2;
  73. if (c[m] == 0 && a[m] == 2)
  74. b[m] = 1;
  75. if (c[m] == 1 && a[m] == 0)
  76. b[m] = 1;
  77. if (c[m] == 1 && a[m] == 2)
  78. b[m] = 2;
  79. if (c[m] == 2 && a[m] == 0)
  80. b[m] = 2;
  81. if (c[m] == 2 && a[m] == 1)
  82. b[m] = 1;
  83. }
  84. for (m = j;m < i;m++)
  85. {
  86. if (a[m] == 0 && c[m] == 0)
  87. b[m] = 0;
  88. else
  89. b[m] = 3 - a[m];
  90. }
  91. }
  92. int max;
  93. if (j >= i)
  94. max = j;
  95. else
  96. max = i;
  97. for (m = 0;m < max;m++)
  98. {
  99. if (m == 0)
  100. result += b[m];
  101. else
  102. result += b[m] * (long long)pow(3,m);
  103. }
  104. printf("%I64d\n",result);
  105. return 0;
  106. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注