题目:

有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。

求先取硬币一方有无必胜的招法。

在提供代买前做几条补充:

(1)这里有一个不是很好理解的规律,就是如果各个堆的硬币数目相异或得到的是0,那么你就处于必输的状态。

(2)如果你的异或结果不为零,那么你一定有方法可以取一次就使对方的异或结果为0

(3)为了使对方的异或结果为0,我们可以改变哪个数字呢?

我们可以选择异或结果最高位的1的贡献者,如图,第二 三 四个数都可以

(4)实际操作的时候我们用不着像(3)说的那么麻烦,异或有很好的数学特性,比如一个数与另一个数异或两次得到的就是它本身,因此我们可以将得到的异或结果与其中的一个值a异或,得到剩余几个数的异或结果x,再使用这个结果x替换a,因此替换过后的四个数异或一定为0,因为异或的结果就是剩余三个数的异或与自身异或。

注:

1)我对这个“必输”的理解是,对方有方法使你一定输,也就是说如果对方选择得当那么你一定输,而不是无论如何你一定输。

2)我试着用我的理解解释一下这种现象:如果你处于异或结果为0的状态,那么你无法在你取完之后使硬币异或结果为零,也就是说对方取的时候异或结果一定不为零,此时对方就有方法使下一次你取的时候异或结果为零,如此循环最终你取的时候的结果会是一堆0相异或,也就是说在此之前对方已经取完了最后一次,你已经输了。

代码实现:

package cn.zzunit.jnvi;
/*** 有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。求先取硬币一方有无必胜的招法。* @author tyrantForever**/
public class Project2 {public static void main(String[] args) {int[] a = {3, 4, 5};findMethord(a);}//用于找到先取硬币的人的必胜走法public static void findMethord(int[] a) {int sum = a[0];for(int i = 1; i < a.length; i++) {sum ^= a[i];}if(sum == 0) {System.out.println("输!");}else {for(int i = 0; i < a.length; i++) {int x = sum ^ a[i];if(x < a[i]) {System.out.println(a[i] + "--->" + x);}}}}}

注:

(1)还需要考虑替换后x的值一定要小于原本的数目,否则不合要求。

【蓝桥java】进制与整除之尼姆堆相关推荐

  1. java进制转换代码

    java进制转换代 定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头 需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; Sy ...

  2. java进制转换界面,java进制转换器 图形用户界面 十进制及其相反数诀别转化为二,四,八,十六进制...

    java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制 package com.rgy.Test; import java.awt.Color; import java.aw ...

  3. Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)

    java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制) 这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁 想起了java中实现栈的操作十分 ...

  4. Java进制转换(二进制、八进制、十进制、十六进制)

    Java进制转换(二进制.八进制.十进制.十六进制) 1. 二进制转其它进制 二进制转八进制 String i="1001";System.out.println(Integer. ...

  5. 【蓝桥java】进制与整除之天平秤重

    题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). ...

  6. java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!

    2进制CPU使用,8进制很少见,10进制适合人类使用,16进制适合编译器和底层程序员使用,希望对你有所帮助! 以下文章是自己从别的地方复制粘贴过来, 总结了一下. 虽然看着有点乱, 但是想学 ,就能看 ...

  7. java进制转化_【Java学习笔记之四】java进制转化

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  8. 【Java学习笔记之四】java进制转化

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  9. java 进制转换 十进制转二,八,十六进制

    十进制转其他进制 因为在java中位运算符是直接对数值的二进制数进行操作的 并且 写的是二进制数在输出和操作时是以十进制数的形式: 所以十进制转二,八,十六进制:就已经实现了二进制,八进制,十进制,十 ...

最新文章

  1. 你所不知道的库存超限做法
  2. 使用sqlmap直连数据库获取webshell
  3. CloudStack学习-1
  4. python自动化测试数据驱动_Python 自动化测试(四):数据驱动
  5. Leetcode 560. Subarray Sum Equals K
  6. python中的函数修饰符
  7. TreeMap源码分析——深入分析(基于JDK1.6)
  8. ADB wifi调试步骤
  9. iphone短信尚未送达_iPhone开启这个功能,从此告别垃圾短信骚扰!
  10. pip修改下载源为国内源 linux系统
  11. python模块下载失败_ubuntu16.04安装python的requests模块失败,怎么解决?
  12. sap系统搭建教程_SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户...
  13. Bluetooth的profile总结
  14. keytool条目_keytool常用命令
  15. Win11查看本机WiFi密码
  16. android机器人方向,Android横版过关类游戏推荐《机器人大挑战》
  17. 关闭微信内置浏览器页面
  18. 微信缓存dat怎么转图片_微信dat文件转换为图片
  19. 微信小程序获取页面高度
  20. 点击修改用户图像php类,php修改图像

热门文章

  1. UE4场景设计学习教程
  2. 【3DMax教程】三维产品可视化视频教程 3d Products Visualization Course
  3. 数据结构 -- 散列表
  4. leetcode-225 队列实现栈
  5. n-netstat 查看网络状态命令
  6. asp.net提交危险字符处理方法之一
  7. android -volley-请求数据
  8. 【转】 Android快速开发系列 10个常用工具类 -- 不错
  9. Study on Android【三】--Intent消息传递
  10. 毫米波雷达、ADAS中的应用以及毫米波雷达的检测、测距、测速和角度测量