A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘胜寒   /  2013-5-10 18:03  /  4648 人查看  /  38 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙浩 于 2013-5-11 15:18 编辑
  1. import java.util.Scanner;

  2. /*
  3. * 相信很多人都看过这个经典的数学故事:
  4.         有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?
  5.         解决方案是这样的: 只要我们把金条分成一块1/7,一块2/7,另一块4/7即可。
  6.         这样的话,第一天给tom七分之一的金条,第二天,让tom归还七分之一的金条,然后给他七分之二的金条,第三天给他七分之一和七分之二两块金条,
  7.         第四天让他归还所有的金条并给他七分之四的那块金条,依此类推就能满足要求了。
  8.         本题是上面故事的加强版:
  9.         假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?
  10.         样例输入
  11.         7
  12.         3
  13.         样例输出
  14.         YES
  15.         分析:
  16.                 M与N的关系
  17.                         M=7 N=3时:每份分子为1 2 4 正好是 2的0次方 2的1次方 2的2次方 正好是:2的0到N-1次方的累加和等于M
  18.                         M=3 N=2时:每份分子为1 2  正好是 2的0次方 2的1次方  正好是:2的0到N-1次方的累加和等于M
  19.                         ……
  20.                         所以:
  21.                                 只需要判断:2的0到N-1次方的累加和是否等于M即可
  22. */
  23. public class Test {
  24.         public static void main(String[] args) {
  25.                 Scanner scanner = new Scanner(System.in);
  26.                 System.out.println("请输入M值");
  27.                 int M = scanner.nextInt();
  28.                 System.out.println("请输入N值");
  29.                 int N = scanner.nextInt();
  30.                 System.out.println(isConform(M, N));
  31.         }
  32. //        定义方法判断是否满足要求
  33.         private static String isConform(int M , int N) {
  34.                 int sum= 0;//定义变量sum存储2的0到N-1次方的累加和
  35.                 //计算2的0到N-1次方的累加和
  36.                 for (int i = 0; i < N; i++) {
  37.                         sum+=1<<i;//1<<i 相当于2的i次方
  38.                 }
  39. //                System.out.println(sum);
  40.                 if (M == sum) {
  41.                         return "Yes";
  42.                 }
  43.                 return "No";
  44.         }
  45. }
复制代码

点评

你想累死我。。你也不要这样搞我吗?  发表于 2013-5-11 14:43
哥们 别压缩包。。。啊  发表于 2013-5-11 14:43
回复 使用道具 举报
  1. /**
  2. *
  3. */
  4. package WeekTest;

  5. /**
  6. * 相信很多人都看过这个经典的数学故事:
  7. 有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?
  8. 解决方案是这样的: 只要我们把金条分成一块1/7,一块2/7,另一块4/7即可。
  9. 这样的话,第一天给tom七分之一的金条,第二天,让tom归还七分之一的金条,然后给他七分之二的金条,第三天给他七分之一和七分之二两块金条,第四天让他归还所有的金条并给他七分之四的那块金条,依此类推就能满足要求了。
  10. 本题是上面故事的加强版:
  11. 假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?
  12. 样例输入
  13. 7
  14. 3
  15. 样例输出
  16. YES
  17. * @author bin
  18. *
  19. */
  20. public class Test_1 {
  21.         public static void main(String []args) {
  22.                 getGold(8,4);
  23.         }
  24.         static void getGold(int M,int N){
  25.                 String can;
  26.                 if(Math.pow(2,N)>M)
  27.                         can="YES";
  28.                 else
  29.                 can="NO";
  30.                 System.out.println(can);
  31.         }
  32. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
刘胜寒 + 2

查看全部评分

回复 使用道具 举报
刘健 发表于 2013-5-10 21:50

代码有个漏洞。。。你自己找吧。。。
找不出我扣分了啊。。。
回复 使用道具 举报
傻瓜一点红 发表于 2013-5-10 22:40

木事,谢谢版主:D
回复 使用道具 举报
本帖最后由 xuluheng718 于 2013-5-11 17:53 编辑

  1. import java.io.*;
  2. public class SliceGold
  3. {
  4. /**
  5.   * @param args
  6.   * @throws IOException
  7.   */
  8. public static void main(String[] args)  {
  9.   // TODO Auto-generated method stub
  10.   BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  11.   System.out.print("请输入每天要分的份数:");
  12.   int m =0;
  13.   int n =0;
  14.   try
  15.   {
  16.    String s1=br.readLine();
  17.    m = Integer.parseInt(s1);
  18.   }
  19.   catch(Exception e)
  20.   {
  21.    System.out.println("非法输入!!!!!");
  22.    return;
  23.   }
  24.   System.out.print("请输入要切的份数:");
  25.   try{
  26.    String s2=br.readLine();
  27.     n = Integer.parseInt(s2);
  28.   }
  29.   catch(Exception e)
  30.   {
  31.    System.out.println("非法输入!!!!!");
  32.    return;
  33.   }
  34.   int n1 = slice(m);
  35.   if(n==n1)
  36.    System.out.println("YES");
  37.   else
  38.   System.out.println("NO");
  39. }
  40. /*规律:
  41.   * 2^0+2^1+2^2+。。。2^n=(2^(n+1))-1
  42.   * 转成公式:
  43.   * 2^n>=m
  44.   *
  45.   * 通过位移的方法求出要切割的次数
  46.   *
  47.   * 返回需要切割的次数然后+1得出切成的份数
  48.   *
  49.   * */
  50. public static int slice(int m)
  51. {
  52.   int n = 0;
  53.   while(true)
  54.   {
  55.    n++;
  56.    if((2<<n)>=m)
  57.    {
  58.     break;
  59.    }
  60.   }
  61.   return n+1;
  62. }
  63. }
复制代码
时间匆忙,没优化!!!!
回复 使用道具 举报
本帖最后由 飞鸟青崖 于 2013-5-11 20:38 编辑

/*
分析:
1,当第一天可以完成时,第m-1天也一样可以完成。第二天可以完成时,第m-2天也可以完成。
   所以只需要判断分法中能不能满足前(m/2)天的需求,如果满足了,那么后面的天数也一样可以满足。
   因此当n>m/2时一定会成功。
2.下面来考虑n<=m/2的情况,在此种情况下,可以单独留一个数使它为m - m/2.
   然后验证剩余的n -1天能否满足前m/2天的需要。依次进行,便得到一次递归。
3,对于特殊情况:所给的天数为1.这个时候肯定也可以满足,所以这就需要在进行判断。
   但是它只能判断初始的天数是不是等于1。
  修改一下,将分法也加进去了。如果所给的天数过多,就将多余的天数分为0.
*/
import java.io.*;
import java.util.*;
class MyTest
{       
        public static void main(String[] args) throws IOException//异常就不处理了。
        {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                int[] a = new int[2];
                for(int x = 0;x<2;x++)
                {
                        a[x]=Integer.parseInt(br.readLine());
                }
                String s = ti1(a[0],a[1],a[1]);
                System.out.println(s);

        }
        private static String ti1(int m,int n,int suo)
        {
                if(suo == n )//判断初始的天数是不是1.
                {
                        if(n == 1)
                        {                               
                                return "YES";
                        }
                }
                String flag = null;
                if(n > m/2)
                {
                       
                        while(m != 0)
                        {
                                System.out.println("分法:"+(m-m/2));
                                m = m/2;
                                n--;
                        }
                        for(int x = m/2;x<n;x++)
                                System.out.println("分法:"+0);
                        return "YES";
                }
                if(n>0)
                {
                        flag = ti1(m/2,--n,suo);
                        if(flag.equals("YES"))
                                System.out.println("分法:"+(m-m/2));
                }
                else
                {
                        return "NO";
                }
                return flag;
        }
}
                       
回复 使用道具 举报
本帖最后由 蔡汉康 于 2013-5-11 19:51 编辑
  1. import java.util.Scanner;
  2. public class DanGao {
  3.         public static void main(String[] args) {
  4.                 System.out.println("题目:假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?");
  5.                 //键盘录入,获取M
  6.                 System.out.println("请输入 M:");
  7.                 Scanner s =new Scanner(System.in);
  8.                 int m=s.nextInt();
  9.                 //键盘录入,获取N
  10.                 System.out.println("请输入 N:");
  11.                 int n=s.nextInt();
  12.                 //算法判断依据
  13.                 boolean flag=(Math.pow(2,n)-1)>=m;
  14.                 //输出结果
  15.                 if(flag)
  16.                         System.out.println("True");
  17.                 else
  18.                         System.out.println("False");
  19.         }

  20. }
复制代码
回复 使用道具 举报
本帖最后由 蔡汉康 于 2013-5-11 19:50 编辑
  1. import java.util.Scanner;
  2. public class DanGao {
  3.         public static void main(String[] args) {
  4.                 System.out.println("题目:假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?");
  5.                 //键盘录入,获取M
  6.                 System.out.println("请输入 M:");
  7.                 Scanner s =new Scanner(System.in);
  8.                 int m=s.nextInt();
  9.                 //键盘录入,获取N
  10.                 System.out.println("请输入 N:");
  11.                 int n=s.nextInt();
  12.                 //算法判断依据
  13.                 boolean flag=(Math.pow(2,n)-1)>=m;
  14.                 //输出结果
  15.                 if(flag)
  16.                         System.out.println("True");
  17.                 else
  18.                         System.out.println("False");
  19.         }

  20. }
复制代码
回复 使用道具 举报
没有全是回复可见
回复 使用道具 举报
import java.util.Scanner;



public class Test7 {
        /*有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求
        解决方案是这样的: 只要我们把金条分成一块1/7,一块2/7,另一块4/7即可。
        这样的话,第一天给tom七分之一的金条,第二天,让tom归还七分之一的金条,
        然后给他七分之二的金条,
        第三天给他七分之一和七分之二两块金条,
        第四天让他归还所有的金条并给他七分之四的那块金条,
        依此类推就能满足要求了。
        本题是上面故事的加强版:
        假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?
        样例输入
        7
        3
        样例输出
        YES*/
        /*
         * 第一个天 M分一
         * 第二天M分2
         * 第m天m分m
                        2的n次幂减一
                        1 3 7 15  31
                        1 2 4 8 16
                        1
         */
        public static void main(String[] args) {
                //输入一个数字做判断
                Scanner sc =new Scanner(System.in);
                System.out.println("输入整数");
                //接受一个数字
                int  n=sc.nextInt();
               
                //w为了下面好计算
                int n1=n+1;
                //计算器为了产生份数
                 int i = 0;
                 //标示
                 boolean falg =false;
                //判断出2的N幂
                 while(n1%2==0)
                {
                        i++;
                        n1=n1/2;
                        if(n1==1){
                                falg = true;
                        }
                }
                 //判断是否可以出去符合数字
                 if(falg){
                         for (int j = 0; j < i; j++) {
                                System.out.println((int)Math.pow(2, j));
                        }
                 }else {
                        System.out.println("no");
                }
        }
         
}

回复 使用道具 举报
本帖最后由 lipingan0520 于 2013-5-12 14:15 编辑

  1. /**
  2.         可以实现此功能,大家慢慢欣赏。
  3. */
  4. class Test113
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 xiaoMing(7,3);        
  9.         }
  10.         
  11.         public static void xiaoMing(int m,int n)
  12.         {
  13.                 int sum = 0;
  14.                 int conut = n;
  15.                 if(n <= m)        
  16.                 {
  17.                         for(int i = 1 ; i <= n;i++)           
  18.                         {
  19.                                 sum = sum + mathPow(2,i-1);        
  20.                                 if(sum >= m)        
  21.                                 {
  22.                                         show(i,m,n,conut);
  23.                                         break;
  24.                                 }
  25.                         }
  26.                 }
  27.                 if(!(sum >= m))
  28.                 {
  29.                         System.out.print("\n答案NO!\n\n");
  30.                         System.out.println("不能分成"+n+"份");        
  31.                 }
  32.         }

  33.         public static void show(int num , int m , int n , int conut)        //把所用的可能性都算出来
  34.         {
  35.                 int[][] arr = new int[m-num+1][m];//定义个2维数组,存储所有可以的组合
  36.                 for(int i = 0 ; i < m-num+1 ; i++)
  37.                 {
  38.                         for(int j = 0 ; j < num+i ; j++)
  39.                         {
  40.                                 if(i == 0)        //将第一行的数进行赋值,这样就能算出第二行来
  41.                                 {
  42.                                         if(j < num)        arr[i][j] = mathPow(2,j);
  43.                                         if(j == num-1)
  44.                                         {
  45.                                                 int k = 0 , sum = k;
  46.                                                 for(k = 0; k < num-1 ; k++)
  47.                                                 {
  48.                                                         sum = sum + arr[i][k];
  49.                                                 }
  50.                                                 arr[i][k] = m - sum;
  51.                                         }

  52.                                 }

  53.                                 else        //算第一行后面的n行数
  54.                                 {
  55.                                         if(j == 0)        arr[i][j] = 1;
  56.                                         else
  57.                                         {
  58.                                                 if(j == num+i-1)
  59.                                                 {
  60.                                                         int k = 0 , sum = 0;
  61.                                                         for(k = 0 ; k < num+i-1 ; k++)
  62.                                                         {
  63.                                                                 sum = sum + arr[i][k];
  64.                                                         }
  65.                                                         arr[i][k] = m - sum ;
  66.                                                 }

  67.                                                 else if(arr[i-1][j] == arr[i][j-1])        
  68.                                                 {
  69.                                                         arr[i][j] = arr[i-1][j];
  70.                                                 }

  71.                                                 else if(arr[i-1][j] != arr[i][j-1])        
  72.                                                 {
  73.                                                         if(arr[i-1][j] < arr[i][j-1])        
  74.                                                                 arr[i][j] = arr[i-1][j];
  75.                                                         else
  76.                                                                 arr[i][j] = arr[i-1][j] - arr[i][j-1];
  77.                                                 }
  78.                                        
  79.                                         }
  80.                                 }
  81.                                 
  82.                         }
  83.                 }
  84.           print(arr,num,conut,m);// 算好后的数组,最小分成金条数,要输出的金条数
  85.         }

  86.         public static void print(int[][] arr , int num , int conut , int m)//最后按格式输出
  87.         {
  88.                 System.out.print("\n答案YES!\n\n可以分成"+conut+"份,最佳分法: ");
  89.                 for(int i = 0 ; i < conut ; i++)        
  90.                         System.out.print(arr[conut - num][i]+"/"+m+"、");
  91.                         System.out.println();
  92.         }

  93.         public static int mathPow(int a,int b)//求幕
  94.         {
  95.                 if(b == 0)        return 1;
  96.                 for(int i = a ; i <= b ; i++)
  97.                 {
  98.                         a=a*2;        
  99.                 }
  100.                 return a;
  101.         }        
  102. }
复制代码
回复 使用道具 举报
  1. <IMG border=0 alt="" src="http://bbs.itheima.com/forum.php?mod=image&aid=18975&size=300x300&key=c6139be8609061d321578e969410b53e&nocache=yes&type=fixnone" aid="attachimg_18975">public class Test {

  2. /**
  3. * 题目:
  4. * 有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?
  5. 解决方案是这样的: 只要我们把金条分成一块1/7,一块2/7,另一块4/7即可。
  6. 这样的话,第一天给tom七分之一的金条,第二天,让tom归还七分之一的金条,然后给他七分之二的金条,第三天给他七分之一和七分
  7. 之二两块金条,第四天让他归还所有的金条并给他七分之四的那块金条,依此类推就能满足要求了。

  8. 本题是上面故事的加强版:
  9. 假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?


  10. 我做的是加强版和普通版都OK的. 测试了N遍.没问题.
  11. 思路:
  12. 1.建立函数.把参数传递进去
  13. 2.以每天给tom几份作为循环条件遍历
  14. 3.在遍历过成中判断.
  15. 4.获取判断结果.跳出循环.
  16. * @param args
  17. */
  18. public static void main(String[] args) {
  19. // TODO Auto-generated method stub

  20. //将参数传递给函数
  21. goldDistribution(2,7);
  22. }
  23. //定义一个函数.分别穿进去的是,分成几分之几的金条,和要给的次数
  24. public static void goldDistribution(int gold,int Distribution){

  25. //为三个属性定义临时变量
  26. int timpgold = Distribution;
  27. int timp= gold;
  28. int tom = 0;
  29. if(timpgold<=0)
  30. {
  31. System.out.println("输入数字有误");

  32. }
  33. //遍历.
  34. for(int x=0;x<=timpgold;x++){

  35. //假如分成3分.到第三次的之前都是一天给一块的.
  36. tom++;

  37. //判断给的块数是否小于分的块数.如果小于.肯定能都给完
  38. if(timpgold-timp<=timp){
  39. System.out.println("yes");
  40. break;
  41. }

  42. //如果是最后一块,并且加一起总数对的,然后在剩的块数和tom手中的块数+1之后相等证明就可以分配成功
  43. if(tom==timp && Distribution ==(Distribution-timp)+tom && Distribution-timp==tom+1){
  44. tom=Distribution-timp;
  45. //throw new RuntimeException("yes!!!");
  46. System.out.println("yes");
  47. break;
  48. }
  49. //如果到了最后一分并且tom手里的金条和要给他的金条相家并等与总数的话
  50. //就把最大的那块金条就给他,然后在判断tom的金条数+1 是否和总数想起匹配.如果条件不相等的
  51. //话就证明,不能满足题目的需求
  52. if(tom==timp && Distribution ==(Distribution-timp)+tom && Distribution-timp!=tom+1) {
  53. System.out.println("no");
  54. break;
  55. }

  56. }
  57. }
  58. }
复制代码

无标题.png (14.37 KB, 下载次数: 0)

这是我

这是我
回复 使用道具 举报

周末答题 版主可见

本帖最后由 黑马-王双 于 2013-5-12 17:50 编辑

y.jpg (60.17 KB, 下载次数: 0)


回复 使用道具 举报
附件是我的工程,请查收!多谢!

GoldAllocation.rar

4.1 KB, 下载次数: 15

回复 使用道具 举报
..我以为那样比较正式点,能加多分,下次不会了~版主辛苦了
回复 使用道具 举报
。。。。。。好题不
回复 使用道具 举报
  1. /*通过观察1/7,2/7,4/7;发现1+2+4=7,1=2-1,1+2=4-1,1+2+4=8-1;
  2.   而1、2、4之间成等比关系,可以得出如下表达式:
  3. (2^0)=(2^1)-1;
  4. (2^0)+(2^1)=(2^2)-1;
  5. (2^0)+(2^1)+(2^2)=8-1=7;
  6.   可得出如下结论:
  7.   当(2^0)+(2^1)+(2^2)+(2^3)+……+[2^(n-1)]=(2^n)-1=M时,
  8.   即当(2^n)>M时要求能够得到满足;
  9.   注意:^为次方符号,而非异或。
  10. */
  11. import java.util.Scanner;
  12. class FenJin
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                         while(true)
  17.                         {
  18.                                 System.out.println("请输入两个整数:");
  19.                                 Scanner scan=new Scanner(System.in);//接收输入的数据
  20.                                 int m=scan.nextInt();
  21.                                 if(m==0)
  22.                                 {
  23.                                         System.out.println("输入的数据有误,请重新输入");
  24.                                         continue;
  25.                                 }
  26.                                 int n=scan.nextInt();
  27.                                 Fen f=new Fen();
  28.                                 f.fen(m,n);
  29.                         }
  30.         }
  31. }
  32. class Fen
  33. {
  34.         void fen(int m,int n)
  35.         {
  36.                 int result=1;
  37.                 for(;n>0;n--)
  38.                 {
  39.                         result*=2;
  40.                  }       
  41.                 if(result>m)
  42.                         System.out.println("YES");
  43.                         else
  44.                         System.out.println("NO");
  45.         }
  46. }
复制代码
回复 使用道具 举报
  1. /*
  2. 题目描述



  3. 相信很多人都看过这个经典的数学故事:

  4. 有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?

  5. 解决方案是这样的: 只要我们把金条分成一块1/7,一块2/7,另一块4/7即可。

  6. 这样的话,第一天给tom七分之一的金条,第二天,让tom归还七分之一的金条,然后给他七分之二的金条,第三天给他七分之一和七分之二两块金条,第四天让他归还所有的金条并给他七分之四的那块金条,依此类推就能满足要求了。

  7. 本题是上面故事的加强版:
  8. 假设现在每天要给tom M分之一的金条,但是只能将其分成N份,请问能满足要求吗?


  9. 样例输入

  10. 7
  11. 3

  12. 样例输出

  13. YES

  14. */
  15. /*
  16. 分析:第一块分1/m也就是分子是2的0次幂,第二块2/m是2的1次幂,第三块4/m,也就是
  17.        2的2次幂,以此类推。因为二进制用0和1能组合遍历出不同的数字。
  18.            因此,分n次即2的次幂的累加值能大于等于m,就能成功。
  19. */
  20. class  Slipt
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 show(7,3);
  25.         }
  26.         public static void show(int m,int n)
  27.         {
  28.                 int count=0;
  29.                 //其实for循环也可以用一个语句代替:count=Math.pow(2,n)-1;
  30.                 for(int i=0;i<n;i++)
  31.                         count+=Math.pow(2,i);
  32.                 if (count>=m)
  33.                         System.out.print("YES");
  34.                 else
  35.                         System.out.print("NO");
  36.         }

  37. }
复制代码
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马