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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 刘胜寒 于 2013-5-24 20:56 编辑

写在别处不给分哦!!!

题目链接:http://bbs.itheima.com/thread-49418-1-1.html



不要使用压缩包。。。
你们要累死版主也不是这个玩法啊。。。

结贴时间为下午六点。。。
六点之后的所有回答一律不予考虑。。。

38 个回复

倒序浏览
hhhhhhhhhhhhhhhhhhhhhhh
回复 使用道具 举报
学习学习{:soso_e100:}
回复 使用道具 举报
题呢,怎么没题?
回复 使用道具 举报
看不到啊
回复 使用道具 举报
我还不会输入函数。我只能想明白这中间关系。 M<=(2^n)-1就可以了啊。 每天分的金子的分母上是M, 分子上需要是1 2 4 8这样的2的n-1次幂数才能满足。这样只要1+2+4+。。。。+2^(n-1)>=M不就可以了吗==>M<=(2^n)-1

点评

嗯,思路明确。。。  发表于 2013-5-10 21:53

评分

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

查看全部评分

回复 使用道具 举报
long 中级黑马 2013-5-10 21:24:32
7#
本帖最后由 long 于 2013-5-10 21:26 编辑

怎么隐藏帖子啊?
回复 使用道具 举报
long 中级黑马 2013-5-10 21:44:37
8#
/*
分析问题:仔细观察可知输入下面这些整数均可满足要求。
输入1和1时,可分成1份:1
输入2和2时,可分成两份:1/2和1/2
输入3和2时,可分成两份:1/3和1/3
输入4和3时,可分成3份:1/4、1/4和2/4
输入5和3时,可分成3份:1/5、2/5和2/5
输入6和3时,可分成3份:1/6、2/6和3/6
输入7和3时,可分成3份:1/7、2/7和4/7
输入8和4时,可分成4份:1/8、2/8、2/8和3/8
........
用sum、n分别代表输入的两个数。它们满足:sum>=2^(n-1)且sum<2^n。
故代码如下:
*/

public class Gold{
        //getInt()函数的功能是从键盘中读入一个整数
        public static int getInt(){
                int i = 0;
                try{
                        byte[] buf = new byte[20];
                        System.in.read(buf); //从键盘输入的字符存储到byte数组buf中
                        String s = new String(buf);
                        i = Integer.parseInt(s.trim()); //将String型变量s转换为相应的int型变量i
                }
                catch(Exception e){
                        System.out.println("程序遇到异常,即将终止");
                        System.exit(0);
                }
                finally{
                        return i;
                }
        }

        //judge(int sum, int num)判断输入的整数是否满足条件
        public static boolean judge(int sum, int n){
        int small = 1, big = 1;//small表示下界,big表示上界
        for(int i = 0; i < n-1; i++)
                small *= 2;
        big = small * 2;
        if(sum >= small && sum < big)
                return true; //满足条件函数自然返回true,否则返回false
        return false;
}                               
        public static void main(String[] args){
                System.out.println("请输入两个整数(每输完一个整数按一次回车键):");
                int sum = getInt();
                int n = getInt();
               
                if(judge(sum, n))
                        System.out.println("YES");
                else
                        System.out.println("NO");
        }
}
                       

点评

加油哦  发表于 2013-5-10 21:56

评分

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

查看全部评分

回复 使用道具 举报
刘健 黑马帝 2013-5-10 21:50:36
9#
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;

  3. public class giveTom {
  4.         public static void main(String[] args) {

  5.                 System.out.print("请输入M和N:");

  6.                 int m = 1;
  7.                 int n = 1;

  8.                 // 接收M
  9.                 BufferedReader strM = new BufferedReader(new InputStreamReader(
  10.                                 System.in));
  11.                 // 接收N
  12.                 BufferedReader strN = new BufferedReader(new InputStreamReader(
  13.                                 System.in));

  14.                 try {
  15.                         m = Integer.parseInt(strM.readLine());
  16.                         n = Integer.parseInt(strN.readLine());
  17.                 } catch (Exception e) {
  18.                         // TODO Auto-generated catch block
  19.                         e.printStackTrace();
  20.                 }

  21.                 // 份数和能分数一致
  22.                 if (m == n) {
  23.                         System.out.println("yes");
  24.                 }

  25.                 if (2 * n - 1 <= m) {
  26.                         System.out.println("yes");
  27.                 } else {
  28.                         System.out.println("no");
  29.                 }
  30.         }
  31. }
复制代码

点评

代码简洁明了。。。可惜就是没有注释。。。  发表于 2013-5-10 21:57

评分

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

查看全部评分

回复 使用道具 举报
陈圳 发表于 2013-5-10 19:04
题呢,怎么没题?

这个是答题贴来...
回复 使用道具 举报
葛杨杨 发表于 2013-5-10 20:10
看不到啊

你再看看。。。有人做出来了。。。就在7#
回复 使用道具 举报
package day2;

public class FenJinTiao {

/**
  * @param args
  * 题目:有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?
  *                 解决方案是这样的:只要我们将金条分成1/7、2/7,另一块4/7即可。
  *                 这样的话,,第一天给tom七分之一的金条,第二天让tom归还七分之一的金条然后给tom七分之二的金条,
  *                 第三天给tom七分之一的金条,第四天让tom归还所有的金条然后给他七分之四的金条,由此类推就可以满足要求了。
  *
  *                 本题是上面故事的加强版:假设现在每天分给tom的金条为m,但是只能将金条分成n份,请问能满足要求吗?
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  //调用分金块函数
  int m=15;//m为分母,即表示m分之一
  int n=4;
  boolean flag=divide(m, n);
  if(flag){
   System.out.println("能满足要求。");
   //打印每段的大小
   for(int x=0;x<n;x++){
    System.out.println((int)Math.pow(2, x)+"/"+((int)Math.pow(2, n)-1));
   }
  }
  else
   System.out.println("不能满足要求。");
}
       
/**
  * 思路:
  * 1、由题1/7、2/7、4/7可将金块长度设为7,每天给tom一块,方便处理,m同样;
  * 2、分情况讨论:m和n为负数时报错,最大范围暂时只考虑int范围内;
  * 3、考虑n满足的临界点,因为每天给的分量一样,所以有
  *                 f(1)=1=Math.pow(2, 1-1)、1段
  *                 f(2)=2=Math.pow(2, 2-1)、2段
  *                 f(3)=f(2)+f(1)、
  *                 f(4)=f(3)+f(1)=f(2)+2f(1)=4=Math.pow(2, 3-1)、3段
  *                 f(5)=f(4)+f(1)、
  *                 f(6)=f(5)+f(1)=f(4)+f(2)、
  *                 f(7)=f(6)+f(1)=f(4)+f(2)+f(1)、
  *                 f(8)=f(7)+f(1)=f(4)+f(2)+2f(1)=8=Math.pow(2, 4-1)、4段
  *                 … … … …
  *                 f(m)=f(m-1)+f(1)=Math.pow(2, n) n段
  *                 可以得出结论:m=Math.pow(2, n)为临界点,分n段最少要给m-1即Math.pow(2, n)-1
  * 4、n大于临界点的永远满足。
  *
  * @return
  */
       
//分金条的方法:需要外部未知元素m、n参与,返回是否满足要求
public static boolean divide(int m,int n){
  boolean flag=false;
  if(m<=0||n<0){
   System.out.println("不可能给tom非正数块金条,或者不可能将金条分成负数份");
   return flag;
  }

  //int p=0;
  //如果传入的p是几分之几,需要将金条长度置为整数以方便处理
  //while(m*p!=1){p++;}


  //根据临界点进行判断,m不大于n段能表示的数拾能满足要求,否则不满足
  if(m<=Math.pow(2, n)-1)
   flag=true;
  return flag;
}
}

点评

今天有点事。。加分晚了点。。忘见谅  发表于 2013-5-11 14:38

评分

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

查看全部评分

回复 使用道具 举报
  1. /*
  2. 题目:相信很多人都看过这个经典的数学故事:

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

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

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

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


  9. 样例输入

  10. 7
  11. 3

  12. 样例输出

  13. YES

  14. 分析:仔细分析就不难看出,其实这道题并不难,基本上纯属属于一到数学逻辑推理题,不难看出在M>=N的情况下,
  15. 只要N满足最基本的条件就可以了,最基本的条件就是:先计算出M能被2除多少次(意思就是用2一直除下去,直到
  16. 出现小数为止),然后就是N大于这个数就可以了;
  17. 例如:若M为7时,7能被2除2次,则N只要大于2就能满足;最基本的分法就是N为3时,分成1/7、2/7、4/7;如果N连
  18. 基本的分法都满足了,其它的就更不用说了; 若M为10时,10能被2除3次,则N只要大于3就能满足;最基本的分法就
  19. 是N为4时,分成1/10、2/10、4/10、5/10;再仔细看,就会发现分子是1、2、4、8、16......是以2的次幂增上去的,
  20. 最后剩下的分子就是用分母减去这些相应的2的次幂所加起来余下的值,如M为10时,最后的分子就是10-1-2-4=5,因
  21. 为你不可能再减8了,再减就变成负数了,所以最基本的分法规律就显而易见了,只要N满足最基本的要求,其它的就
  22. 都满足了。

  23. 思路:1、先判断M是否大于等于N;
  24.           2、满足1条件后,计算出M能被2除多少次;
  25.           3、再判断N是否大于那个次数就可以了。
  26.          
  27. 步骤:1、先用if条件判断M是否大于等于N,如果大于等于满足就继续,如果不满足就就结束;
  28.           2、用while循环计算出M能被2除多少次;
  29.           3、再用if条件判断N是否大于那个次数。
  30. */

  31. import java.util.Scanner;
  32. public class Demo
  33. {
  34.         public static void panDuan(int M,int N)//定义一个计算函数,计算M能被2除多少次,并且判断N是否满足要求
  35.         {
  36.                 int number=0;//此变量用于统计M能被2除多少次的次数
  37.                 if(M>=N)//判断两个数值是否符合题目要求
  38.                 {
  39.                         while(M/2!=0)
  40.                         {
  41.                                 M=M/2;
  42.                                 number++;
  43.                         }
  44.                         if(N>number)//判断N满足要求
  45.                                 System.out.println("YES,满足要求");
  46.                         else//判断N不满足要求
  47.                                 System.out.println("No,不满足要求");
  48.                 }
  49.                 else
  50.                         System.out.println("此组数据无意义");
  51.         }
  52.         public static void main(String[] args)//主函数
  53.         {
  54.                 Scanner in=new Scanner(System.in);//创建一个对象接收输入的数值
  55.                 System.out.println("请输入M的值:");
  56.                 int M=in.nextInt();
  57.                 System.out.println("请输入N的值:");
  58.                 int N=in.nextInt();
  59.                 System.out.println("你输入的M值为:"+M+";"+"你输入的N值为:"+N);
  60.                 panDuan(M,N);
  61.         }
  62. }
复制代码

点评

今天有点事。。加分晚了点。。忘见谅  发表于 2013-5-11 14:38

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 孙金鑫 于 2013-5-10 22:51 编辑
  1. /*

  2. 把金条分成一块1/7,一块2/7,另一块4/7即可。

  3. 思路:分成三份之后分别是:1/7,一块2/7,另一块4/7。
  4. 之后的每一天得到的数值,跟他的第几天是一样的,
  5. 如第一天1,第二天2,第三天3,以此类推。。。。。

  6. 也就是说分完之后,一个数或者两两相加,或者所有的书相加,可以表示每一天。

  7. 通过这个规律,我没可以看出,7=2^3-1,然后2的0次方,2的1次方,2的2次方。



  8. 如果是8天,每天得到八分之一呢?
  9. 就会大于7天,但是小于16天,这样就必须分成4分了,
  10. 即:7<8天<2^4-1
  11. */

  12. import java.util.*;
  13. class  Test
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 //这里可以输入数字的M和N
  18.                 Scanner sn = new Scanner(System.in);
  19.                 System.out.println("需要的天数M:");
  20.                 int M = sn.nextInt();
  21.                 System.out.println("需要把金条分成几份:");
  22.                 int N = sn.nextInt();
  23.                
  24.                 //判断M与N对应的是否正确
  25.                 if(M<=Math.pow(2,N)-1 && M>=Math.pow(2,(N-1)))//如果两者在2的N方-1和2的N-1次方之间
  26.                 {
  27.                         System.out.println("Yes");
  28.                 }
  29.                 else
  30.                         System.out.println("注意:这种金条分配方式是错误的!");
  31.                   
  32.         }
  33. }

复制代码

点评

今天有点事。。加分晚了点。。忘见谅  发表于 2013-5-11 14:38

评分

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

查看全部评分

回复 使用道具 举报
在网上找的思路:
解析这类题
首先要明白     
  2^0+2^1+2^2+。。。2^A=〔2^(A+1)〕-1
     如: 2的0次一直加到2的9次就等于2的10次方减1
为什么要用2的几次方 ?
因为在二进制中
0、1两个数字能够组成任意一个数。

在解题时,把总量看成M  要分成的分数看成N   
则2^N>=M  N取最小值
(可做为公式解决此类型运算题)
代码如下:
class Exam
{
        public static void main(String args[])
        {
                int m =7;
                int n = 3;
               
               
                int num = 0;                                                                                                //记录分子的总数
               
                if(Math.pow(2,n)>=m)                                                                //判断是否可以这样分
                {
                        for(int i=0;i<n;i++)                                                        //利用for循环累加每份的分子
                        {
                                num = num + (int)Math.pow(2,i);
                        }
                        if(num==m)                                                                                                //判断分子是否等于分母,也就是判断总数是否等于1
                        {
                                System.out.println("YES");
                        }
                        else
                        (
                                System.out.println("NO");
                        )
                }
                else
                {
                        System.out.println("NO");
                }       
        }
}

评分

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

查看全部评分

回复 使用道具 举报
楼主看看{:soso_e100:}
  1. /*
  2. 有一个金条,你每天需要给tom七分之一,但是你只能将其分成三份,问怎么分才能满足要求?

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

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

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

  7. 可以知道分出的分数 刚好事 1 2 4 8 即是2的n-1次方
  8. 并且总数刚好是前n-1次方的和
  9. 可知只要满足前 n-1次方和等于输入的sum就输出YES
  10. 2^0  2^1  2^2      1+2+4=7
  11. 1/7  2/7  4/7      2^(N-1)
  12. 样例输入

  13. 7
  14. 3

  15. 样例输出

  16. YES


  17.                
  18. */
  19. import java.util.Scanner;

  20. class Gold
  21. {
  22.         //输入两个参数
  23.         public void goldFun(int m,int n)
  24.         {
  25.                 //初始化sum
  26.                 int sum = 1;
  27.                 //定义i变量,小于分的分数  1/7  2/7  4/7  
  28.                 for(int i = 1;i < n;i++)
  29.                 {
  30.                                 sum += 2*i;  //1+2+4
  31.                 }
  32.                 //前n-1次的和等于m时,打印yes
  33.                 if(sum == m)
  34.                 {
  35.                         System.out.println("YES");
  36.                 }
  37.                 else
  38.                 {
  39.                         System.out.println("NO");
  40.                 }
  41.         }
  42. }
  43. class GoldenDemo
  44. {
  45.         public static void main(String[] args)
  46.         {
  47.                 Scanner in = new Scanner(System.in);
  48.                 //每天给多少分之一
  49.                 int M = in.nextInt();
  50.                 //分成几份
  51.                 int N = in.nextInt();
  52.                 //new Gold对象
  53.                 Gold gd = new Gold();
  54.                 //对象调用goldFun()函数
  55.                 gd.goldFun(M,N);
  56.         }
  57. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
  1. package com.leejuen.org;

  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;

  4. public class test {

  5.         /**
  6.          * 我的理解是
  7.         7 3
  8.         同题目
  9.         可以知道分出的分数 刚好事 1 2 4 8 2的n-1次方
  10.         总数刚好是前n-1次方的和
  11.         可知只要满足前 n-1次方和等于输入的sum就输出YES
  12.         故代码如下
  13.          */
  14.         public static void main(String[] args) throws Exception{
  15.                 // TODO 自动生成的方法存根
  16.                 int cc;
  17.             long m,n;
  18.             BufferedReader strin=new BufferedReader(new InputStreamReader(System.in));
  19.             m=Integer.parseInt(strin.readLine());
  20.             n=Integer.parseInt(strin.readLine());
  21.             if(Judge(m,n))
  22.             System.out.println("YES");
  23.         else
  24.                  System.out.println("no");
  25.         }
  26.         public static boolean Judge(long sum,long num)
  27.         {
  28.             int i;
  29.             long a = 1,s = 1;
  30.             if(sum == num) return true;        //如果输入的俩数据相等 返回是
  31.             for(i = 1;i<num;i++)           //求2的num-1次方
  32.             {
  33.                 a = a*2;
  34.                 s = s + a;               //将1 - 2的num-1次方依次加起来
  35.             }
  36.             if(sum == s)                 //2的次方和等于sum
  37.             {
  38.                 return true;
  39.             }
  40.             return false;
  41.         }

  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1 应该是 2^n - 1

查看全部评分

回复 使用道具 举报
第一次做这个版题目 不知道这样写行么

getMarks.zip

5.09 KB, 阅读权限: 100, 下载次数: 0

Judge是封装好的,Judge是主函数的类

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
Gold.zip (1010 Bytes, 下载次数: 0)

还望版主指教

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1 希望以后代码这种活动提交代码。谢谢。.

查看全部评分

回复 使用道具 举报
import java.util.*;

public class TestF {

       
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入每天给予M分之一的M值:");
                int m = sc.nextInt();
                System.out.println("输入分成的份数N(N>=2)的值:");
                int n = sc.nextInt();
                int a1 = 1 ;
                int a2 = 2 ;
                int a3 = 0 ;
                int sum = 0 ;
                /*对于分子而言,从第三项开始每一项都应该是前两项和加1,这类似于Fibonacci数列,只是每一项都等于前两项和+1
                 * 这里运用简单的for循环来运行
                 */
                if(n==2){
                        sum=3;
                }else{
                        for(int i=3;i<=n;i++){   //对分子求和,得到分母的最大值,即每天给予的最小分数
                                a3 = a1+a2+1;
                                sum = a1+a2+a3;
                                a1 = a2;
                                a2 = a3;
                        }
                }
                if(m<=sum){                    //当每天分给对方的量大于能够分给对方最小量的时候为可行输出YES
                        System.out.println("YES");
                }
                else{
                        System.out.println("NO");
                }

        }

}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1 哥们。在想想吧。

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马