第四次反转硬币NO.2

John Gilder在等车的时候拿出一摞硬币。首先这些硬币全部正面朝上,第一次翻转最上面的一个,第二次把最上面的两个一起翻转,第三次把最上面的三个硬币一起翻转,...,第n次一起翻转所有的n个硬币,第n+1次再将第一个硬币翻转,...,第m次将最上面m%n个硬币一起翻转。他发现,经过有限次的翻转后,硬币还能恢复到全部正面朝上。请编程验证这个过程。

coin flip

图:四个硬币的翻转过程

输入:

初始硬币的数量n

输出:

至少需要多少次翻转,又能恢复最初的正面朝上。

样例输入:

4

样例输出:

11

 

import java.util.Scanner;

public class Main {
	/**
	 * 反转硬币
	 */
	public static void main(String[] args) throws Exception {
		Scanner cin = new Scanner(System.in);
		//定义输入硬币数据
		int coinNum = cin.nextInt();
        playCoin(coinNum);		
	}
        private static void playCoin(int coinNum){
		//判断硬币数量,如果小于1,结束程序
		if(coinNum<1){
			System.out.println("没有硬币");
			return;
		}
               //定义布尔数组,跟踪硬币正反面
		boolean[] flag = new boolean[coinNum];
		//true为正面,false为反面
		for(int i=0;i<coinNum;i++){
			//初始所有硬币为正面的啊
			flag[i]=true;
		}
	        //定义反转次数
		int count = 0;
		//定义反转真假
		boolean t = true;
		//处理反转硬币正反情况BEGIN
		while(t){
			int loop = count%coinNum;
			if(loop==0){
				flag[0]=!flag[0];
			}else{
				for(int j=0;j<=loop/2;j++){
					boolean coin = flag[j];
					flag[j]=flag[loop-j];
					flag[loop-j]=coin;
				}
				for(int j=0;j<=loop;j++){
					flag[0]=!flag[0];
				}
			}
		        //记录反转次数
			count++;
			t=false;
		        //判断硬币是否都为正面,如果是则退出循环输出反转数
			for(int n=0;n<coinNum;n++){
				if(!flag[n]){
					t=true;
					break;
				}
			}
		}
		//处理反转硬币正反情况END
		//输出硬币反转次数
		System.out.println(count);
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值