剪绳子游戏

重申一下这个游戏的规则吧:

  

给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?
例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

说实话,这个是一个规律游戏,我们只需要通过程序用语言解释出来就OK了,自己想了好长时间还是没有发现这个规律,最后参考大佬们的代码明白了。

public class demo {
    /*
    当target为2时结果为1
    为3时结果为2
    为4时2*2
    为5时2*3
    为6时3*3
    为7时2*2*3或者4*3
    为8时2*3*3
    为9时3*3*3
    为10时2*2*3*3或者4*3*3
    为11时2*3*3*3
    为12时3*3*3*3
    为13时2*2*3*3*3或者4*3*3*3
   规律:
    当一个数大于3时,呈现的规律为每3个为一个周期,周期中的3个结果都是有规律的。
*/ public static long c(long target){ if (target==1){ return 0; }else if (target == 2){ return 1; }else if (target == 3){ return 2; } //第几层 long x = target%3; //几个周期 long y = target/3; if (x==1){ return (long) (2*2*Math.pow(3,y-1)); }else if (x==2){ return (long)(2*Math.pow(3,y)); }else { return (long)(Math.pow(3,y-1)); } } public static void main(String[] args) { System.out.println(c(8)); } }
原文地址:https://www.cnblogs.com/shiji7/p/11950985.html