黑马程序员技术交流社区

标题: 新手遇见小问题 [打印本页]

作者: 尹善波    时间: 2012-6-29 18:08
标题: 新手遇见小问题
本帖最后由 菠菜(yinshi) 于 2012-6-30 14:32 编辑

在0~99之间的一百个整数中计算数字5出现的次数,并将带有数字5的组合输出。
作者: 张扬123    时间: 2012-6-29 18:12
这样的问题我觉得还是自己去练习比较好,毕竟视频里面有教的,并且毕老师视频里的代码不用怎么改动就能完成你的这个问题了。
作者: 邵阳    时间: 2012-6-29 18:25
本帖最后由 邵阳 于 2012-6-29 18:36 编辑

看楼下,我写错啦

作者: 游洪波    时间: 2012-6-29 18:29
呵呵,我不知道这是帮你还是害你,不过你既然问了,我就把答案给你弄上来了
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                int i=0;//用来统计5出现的次数
                for(int i=0;i<=99;i++){//负责循环遍历0-99
                        if(i/10==5 || i%10==5){//这个是用来判断当前数字是不是含5
                                System.out.println(i);
                                i++;//每找到一个I+1
                        }
                }
                System.out.println("5一共出现了"+i+"次");//输出5出现的次数
        }

作者: 谭立文    时间: 2012-6-29 18:30
public class Test
{
        public static void main(String[] args)
        {
                int count = 0;
                for(int i = 1; i < 99; i++)
                {
                        if(i % 5 == 0 && i % 10 != 0 )
                        {
                                System.out.printf(i + " ");
                                count++;
                        }
                }
                System.out.println("\n5出现的次数: " + (count + 1));
        }
}
写的比较简单,注意只是在0 - 100以内是对的啊,如果是三位数,可能有  950  同时可以被5和10整除的 还有955等出现多个5的,若想写一个在任意范围内都行的算法,我的思路是,首先筛选出能够被5整除的数,缩小范围,然后在逐个去处理这个数中5出现的次数。

作者: 邵阳    时间: 2012-6-29 18:39
谭立文 发表于 2012-6-29 18:30
public class Test
{
        public static void main(String[] args)

你写错啦啊,50,51,52这些你没算上啊,刚才我都这么写的又删啦
作者: 谭立文    时间: 2012-6-29 18:48
邵阳 发表于 2012-6-29 18:39
你写错啦啊,50,51,52这些你没算上啊,刚才我都这么写的又删啦

额只想图效率了
作者: 谭立文    时间: 2012-6-29 19:03
在这里给楼主说声抱歉啊,考虑不周。
重新写了一下
public class Test

{

        public static void main(String[] args)
        {

               int start = 0;
               int end = 100;
               int count = 0;
               for(int i = start; i < end; i++)
               {
                       int data = i;
                       boolean isHaveFive = false;
                      while(data > 0)
                      {
                              int m = data % 10;
                              if(m == 5)
                              {
                                      isHaveFive = true;
                                      count++;
                              }
                              data /= 10;
                      }
                      if(isHaveFive)
                      {
                              System.out.print(i + " ");
                      }
               }
               System.out.println("\n5一共出现的次数:" + count);
               
        }

}

作者: 谭立文    时间: 2012-6-29 19:22
游洪波 发表于 2012-6-29 18:29
呵呵,我不知道这是帮你还是害你,不过你既然问了,我就把答案给你弄上来了
        public static void main(Stri ...

哥们55中有两个5,还真不要觉得题目简单,我刚才也写错了,尴尬了。
作者: 黑马-李勇    时间: 2012-6-29 19:53
思想:
1定义一个计数器
2for循环1~99
3循环内判断这个数除5或除50取余,有一个条件为真即为真。
4循环内计数器加1
5循环结束
6打印计数器
程序我没写,我同意游洪波的,但不知为什么抛异常啊{:soso_e132:}
也许不对,你试下吧。
作者: 邵阳    时间: 2012-6-29 21:22
本帖最后由 邵阳 于 2012-6-30 16:22 编辑
谭立文 发表于 2012-6-29 19:03
在这里给楼主说声抱歉啊,考虑不周。
重新写了一下
public class Test


你写的太复杂啦精简了一下,还好理解
class Test
{
        public static void main(String[] args)
        {
                        int count=0;
                        
            for(int i = 0; i < 100; i++)
            {
                                int num=i;
                 while(num > 0)
               {
                                        if(i % 10==5)
                                        {
                                                count=count+1;
                                        }
                                        num/= 10;
                                }                                          
            }
            System.out.println("一共出现的次数:" + (count));
               
        }

}

我上面的代码写错啦,大家不要看啦
作者: 谭立文    时间: 2012-6-29 21:28
邵阳 发表于 2012-6-29 21:22
你写的太复杂啦精简了一下,还好理解
class Test
{

方法有很多啊,不一定非得这么写啊。
作者: 邵阳    时间: 2012-6-29 21:31
游洪波 发表于 2012-6-29 18:29
呵呵,我不知道这是帮你还是害你,不过你既然问了,我就把答案给你弄上来了
        public static void main(Stri ...

已经定义了i,不能在后面定义了啊。所以你的错啦。改为int  num=0  
System.out.println("5一共出现了"+num+"次");
作者: 邵阳    时间: 2012-6-29 22:18
谭立文 发表于 2012-6-29 19:03
在这里给楼主说声抱歉啊,考虑不周。
重新写了一下
public class Test

哥们在、你代码里面   data/=10  有什么作用啊

作者: 罗文杰    时间: 2012-6-29 22:37
本帖最后由 罗文杰 于 2012-6-29 22:40 编辑

{:soso_e176:}我提供一个思路吧,但是楼主自己实现下吧。
思路: 遍历数字,把数字转成String, 然后用contain方法判断是否包含"5",包含就加把技术器加1(中间加上判断这个字符串是不是"55",是的话就加计数器就加2)。代码上应该还是很好实现的。
作者: 谭立文    时间: 2012-6-29 23:25
邵阳 发表于 2012-6-29 22:18
哥们在、你代码里面   data/=10  有什么作用啊

有什么不对吗?比如 45678 中有5  所以把这五个数拆分了啊
45678 > 0
45678 % 10 = 8 != 5;
45678 / 10 = 4567
后面不用解释了吧
作者: 孔令金    时间: 2012-6-30 07:24
标题: 提供一个新的思路吧,不足之处请大家斧正哈。
本帖最后由 孔令金 于 2012-6-30 07:40 编辑

提供一个新的思路吧,不足之处请大家斧正哈。
    public static void main(String[] args) {
        int k = 0;//用来统计5出现的次数
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                if (i == 5 || j == 5) {
                    System.out.println(i * 10 + j);
                    k++;
                    if (i == 5 && j == 5) {//出现55的情况
                        k++;
                    }
                }
            }
        }
        System.out.println("出现5的次数:" + k);//输出5出现的次数
    }

作者: 尹善波    时间: 2012-6-30 14:21
罗文杰 发表于 2012-6-29 22:37
我提供一个思路吧,但是楼主自己实现下吧。
思路: 遍历数字,把数字转成String, 然后用conta ...

这个方法挺不错,不知哪位大神仙出神力实现一下下
作者: 尹善波    时间: 2012-6-30 14:29
邵阳 发表于 2012-6-29 21:22
你写的太复杂啦精简了一下,还好理解
class Test
{

神妙
:)
作者: 孙飞    时间: 2012-6-30 17:47
谭立文 发表于 2012-6-29 23:25
有什么不对吗?比如 45678 中有5  所以把这五个数拆分了啊
45678 > 0
45678 % 10 = 8 != 5;

原来是这样啊,受教了,谢了
作者: 刘蕴学    时间: 2012-6-30 18:00
本帖最后由 刘蕴学 于 2012-6-30 18:04 编辑

我也凑个热闹
  1. public class Count
  2. {
  3.         public static void main(String[] args)
  4.     {
  5.                 System.out.println("出现总次数为:" + getValueCount(0, 99, 5));
  6.     }
  7.         
  8.         public static int getValueCount(int begin, int end,int num)
  9.         {
  10.                 int tmp = begin;
  11.                 int count = 0;
  12.                 while(true)
  13.                 {
  14.                         if(tmp % 10 == num)
  15.                                 count++;
  16.                         if(tmp < 10)
  17.                         {
  18.                                 if(0 != count)
  19.                                         System.out.println("Value=" + begin + "   Count=" + count);
  20.                                 if(end == begin)
  21.                                         return count;
  22.                                 else
  23.                                         return count + getValueCount(begin + 1, end, num);
  24.                         }
  25.                         tmp /= 10;
  26.                 }
  27.         }
  28. }
复制代码
  1. 控制台输出

  2. Value=5   Count=1
  3. Value=15   Count=1
  4. Value=25   Count=1
  5. Value=35   Count=1
  6. Value=45   Count=1
  7. Value=50   Count=1
  8. Value=51   Count=1
  9. Value=52   Count=1
  10. Value=53   Count=1
  11. Value=54   Count=1
  12. Value=55   Count=2
  13. Value=56   Count=1
  14. Value=57   Count=1
  15. Value=58   Count=1
  16. Value=59   Count=1
  17. Value=65   Count=1
  18. Value=75   Count=1
  19. Value=85   Count=1
  20. Value=95   Count=1
  21. 出现总次数为:20
复制代码

作者: 孙飞    时间: 2012-6-30 18:02
本帖最后由 feigecal 于 2012-6-30 18:11 编辑
孔令金 发表于 2012-6-30 07:24
提供一个新的思路吧,不足之处请大家斧正哈。
    public static void main(String[] args) {
        int  ...


用或的时候就已经包括了55的情况 了,所以下面不用再判断了,我按你的思路写了一下
class Test
{
public static void main(String[] args)
{
  int x=0;
  for (int y=0;y<10 ;y++ )
  {
   for (int z=0;z<10 ;z++ )
   {
    if (y==5||z==5)
    {
     System.out.print((y*10+z)+" ");
     x++;
    }
   }
  }
  System.out.println();
  System.out.println("5出现的次数"+x);
}
}
打印结果为:
5  15  25  35  45  50  51  52  53  54  55 56  57  58  59  65  75  85  95
5出现的次数19
作者: 孙飞    时间: 2012-6-30 18:15
刘蕴学 发表于 2012-6-30 18:00
我也凑个热闹

你这种效果是怎么弄出来的,是截图还是什么?我想搞这样效果的,结果搞成html代码了,呵呵
作者: 孔令金    时间: 2012-6-30 18:21
feigecal 发表于 2012-6-30 18:02
用或的时候就已经包括了55的情况 了,所以下面不用再判断了,我按你的思路写了一下
class Test
{

题目要求是”计算数字5出现的次数“,不是计算”含有数字5的数出现的个数“,这两者还是有区别的。因此数字5出现了20次,含5的数有19个。
作者: 孙飞    时间: 2012-6-30 18:31
本帖最后由 feigecal 于 2012-6-30 18:38 编辑
孔令金 发表于 2012-6-30 18:21
题目要求是”计算数字5出现的次数“,不是计算”含有数字5的数出现的个数“,这两者还是有区别的。因此数 ...


理解错题意了,呵呵,你是正确的
class Test
{
public static void main(String[] args)
{
  int x=0;
  for (int y=0;y<10 ;y++ )
  {
   for (int z=0;z<10 ;z++ )
   {
    if (y==5||z==5)
    {
     System.out.print((y*10+z)+" ");
     x++;
    }
    if (y==5&&z==5)
    {
     System.out.print("\"55中出现了两次5\""+" ");
     x++;
    }
   }
  }
  System.out.println();
  System.out.println("5出现的次数"+x);
}
}

作者: 刘蕴学    时间: 2012-6-30 18:53
feigecal 发表于 2012-6-30 18:15
你这种效果是怎么弄出来的,是截图还是什么?我想搞这样效果的,结果搞成html代码了,呵呵 ...

点编辑里边有<>这样的图标,你在里边粘贴下代码就行了
作者: 孙飞    时间: 2012-6-30 19:02
刘蕴学 发表于 2012-6-30 18:53
点编辑里边有这样的图标,你在里边粘贴下代码就行了

嗯,谢了
作者: 邵阳    时间: 2012-6-30 20:19
本帖最后由 邵阳 于 2012-6-30 20:28 编辑

终于得出正确的啦
class Test
{
        public static void main(String[] args)
        {
                        int count=0;
                        
            for(int i = 0; i < 100; i++)
            {
                 int num=i;
                 while(num > 0)
                                {
                                        if(num % 10==5)
                    {
                                                count=count+1;
                         System.out.println(i);              
                    }
                       num/= 10;
                    }  
                        
            }
            System.out.println("一共出现的次数:" + (count));
               
        }

}

D:\java\zuoye\ceshi1>java  Test
5
15
25
35
45
50
51
52
53
54
55
55
56
57
58
59
65
75
85
95
一共出现的次数:20

作者: 金龙    时间: 2012-6-30 21:27
在想要实现需求的时候,脑子里不要光想着代码要怎么写,这样就会陷入一个僵局,毕老师的视频一再强调,要有思路。代码都是思想的产物

比如:

需求:在0~99之间的一百个整数中计算数字5出现的次数,并将带有数字5的组合输出。

思路:只要含有5,就给输出,并计数。
         那么:1,遍历0到99之间所有的整数,以供去寻找符合要求的数字。
               2,只要含5就输出,那么需要将数字的十位和个位取出来,只要其中一个有5,就满足条件。
               3,计算个数,这是需要用到计数器思想,即,满足条件,就++。

结合以上思路,一个代码就出来了。,所以,我建议以后遇到问题都这样分析一下,毕竟,工作以后,很多问题都需要自己独立解决。
而思路,就是你解决问题的关键!
作者: 吴琼    时间: 2012-6-30 23:26
看见很多人用不同的方法都能做出来.下面也分享下我的想法吧.我用的是正则表达式.
package Test;
public class getFive_Demo {
/**
  * 在0~99之间的一百个整数中计算数字5出现的次数,并将带有数字5的组合输出。
  */
public static void main(String[] args) {
  String reg = ".?5";
  String reg1 = "5.";
  String reg2 = "55";
  int count = 0;
  String s = null;
  for (int i = 0; i < 100; i++) {
    s = i+"";//将i的值转换为字符串.因为只有字符串菜鸟皮喷正则表达式
    //这里是判断只有1个5出现的情况
   if(s.matches(reg)||s.matches(reg1)){
    count++;
   }
   //这里判断有2个55出现的情况
   if(s.matches(reg2)){
    count++;
   }
  }
   System.out.println(count);
  
}
}


作者: 余明辉    时间: 2012-7-1 01:05
int count = 0;  
                int one = 0;        //个位的数
                int ten = 0;        //十位的数
        for(int i=0; i<100; i++) {
               
                if(i<10) {                //if else分开处理1位数和2两位
                        one = i%10;
                        if(one == 5) {
                                count ++;
                                System.out.println(i);
                        }
                } else {
                        one = i%10;
                        ten = i/10;
                        if(one == 5) {count ++; System.out.println(i);}
                        if(ten == 5) {count ++; System.out.println(i);}
                }       
        }
        System.out.println("count:" + count);
这种思路处理3位数也是OK的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2