黑马程序员技术交流社区

标题: 对自己很无语 [打印本页]

作者: 邵阳    时间: 2012-6-29 22:52
标题: 对自己很无语
本帖最后由 邵阳 于 2012-7-1 22:39 编辑

今天解答别人的问题就是那个在100之内输出含有5的数,然后自己敲了一下代码,然后虽然得出正确结果,但仔细想了想,我凌乱了,不知道怎么得出的结果,代码如下:
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;//当i 等于51,52,53......58,59时怎么运算啊
                                        }
                                        num/= 10;//这个有什么作用,我知道这个相当于num=num/10,我说的是在整个结构中的作用
                                }                                          
            }
            System.out.println("一共出现的次数:" + (count));
               
        }
为什么能够运算出正确结果啊,感觉 if(i % 10==5)和num/= 10都没什么关系啊
想的好头疼啊,都不知道怎么得到结果的。
另一段代码:
class Test1
{
        public static void main(String[] args)
        {
   int count=0;
   
            for(int i = 0; i < 100; i++)
            {
     if(i% 10==5)
     {
      count=count+1;
      
     }
     i/=10;
                    
            }
            System.out.println("一共出现的次数:" + count);
               
        }
}为啥不能java编译,详解啊。急死啦,头大啊。



作者: 唐志兵    时间: 2012-6-29 22:54
本帖最后由 唐志兵 于 2012-6-29 23:05 编辑

我也很无语,楼主技术分比我还多。。

num /=10   相当于 num = num/10;
再给你个例子。
  1. public class my10 {
  2. public static void main(String[] args) {
  3. //含有5的数 是神马? 肯定是能被5整除的,比如5,15,25 但是10,20,30也可以额,所以只能是5的奇数倍才会包含5
  4. int i = 1,num = 0;

  5. while(num < 95){
  6. num = i * 5;
  7. i += 2;
  8. System.out.println(num);
  9. }
  10. }
  11. }
复制代码

作者: 陌花╮有意、    时间: 2012-6-29 23:33
public class Test_100 {
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;
     System.out.println(i);         //在这里添加一行代码,可以看出打印结果
    }
    num /= 10;// 这个有什么作用,我知道这个相当于num=num/10,我说的是在整个结构中的作用
   }
  }
  System.out.println("一共出现的次数:" + (count));
}
}

结果:
5
15
15
25
25
35
35
45
45
55
55
65
65
75
75
85
85
95
95
一共出现的次数:19

很明显计算过程是错误的, 每个数出现两次   打印的结果19只是巧合

作者: 吴琼    时间: 2012-6-29 23:40
给你解释下这个程序吧.
class Test
{
        public static void main(String[] args)
        {
                        int count=0;
                        
            for(int i = 0; i < 100; i++)
            {
                                int num=i;//开始i=0;则num也就等于0;while(false)则while不执行.当i自增后,i=1,num也就等于1了;while(true),执行while语句代码块
                 while(num > 0)
               {
                                        if(i % 10==5)
                                        {
                                                count=count+1;
                                        }                当num=1;进来执行到这里的时候.假设没有num=num/ 10;这个语句的时候.那么我问你num的值是不是没有改变是不是一直是1;
                                                        既然num的值没改变一直是1.while循环是不是一直在做?
                                      //num=num/ 10;这里就相当于跳出循环. num=1/10; num就=0;了就不满足while循环了.就开始执行for循环了这个时候num=2了.
                                                                当num是一个2位数的时候. //num=num/ 10这里就做了2个操作.假如num=10了.num=num/ 10这时候num=1.满足while循环
                                                               当再做一次的时候就跳出循环了.
                                 其实这里可以写成 num=0;或者 break;也是可以的.楼主可以试试

                                 感觉说的啰嗦了点,看看楼主能明白不.
                                }                                          
            }
            System.out.println("一共出现的次数:" + (count));
               
        }
}
作者: 谭立文    时间: 2012-6-29 23:41
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)            //这里只是完成了将一个数的每一位拆分的操作  然后将每一位与5比较若相等就计数
                      {
                              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 23:42
出现2次是因为num是一个两位数的时候  num要跳出while循环num=num/ 10;要做2次运算. num=num/ 10;这里应该改为  num=0;或者break;
作者: 常佳杰    时间: 2012-6-29 23:53
  //num=num/ 10;这里就相当于跳出循环. num=1/10; num就=0;了就不满足while循环了.就开始执行for循环了这个时候num=2了.
                                                                当num是一个2位数的时候. //num=num/ 10这里就做了2个操作.假如num=10了.num=num/ 10这时候num=1.满足while循环
                                                               当再做一次的时候就跳出循环了.
                                 其实这里可以写成 num=0;或者 break;也是可以的.楼主可以试试

说的挺对的..楼主可以看看哈
作者: 陌花╮有意、    时间: 2012-6-29 23:56
不好意思,计算含5的数没错,只是每个含有5的数被计算两次  就是由于while循环的缘故在含有大于10以上的数时,每次需要计算两次才能退出
num/= 10;//  是为了保证while循环能退出
如果没有就成死循环了

比如i=51  
首先num=i=51,然后if不满足 num/10后等于5,继续while循环,if还是不满足,num/10后为0 退出while
同理
i=55
首先num=i=55,if满足,num/10后为5,继续while,if还是满足(因为if的判断只与i有关),num/10后为0,while退出
作者: 谭立文    时间: 2012-6-30 00:01
本帖最后由 谭立文 于 2012-6-30 00:04 编辑
谭立文 发表于 2012-6-29 23:41
public class Test

{


data =  123456;
123456 % 10 = 6           不计数
123456 /10 = 12345;
12345 % 10 = 5            计数
12345 / 10 = 1234;
1234 % 10 = 4;             不计数
1234 / 10 = 123;
123 % 10 = 3;               不计数
123 / 10 = 12;
12 % 10 = 2;                 不计数
12 / 10 = 1;
1 % 10 = 1;                  不计数
1 / 10 = 0                    退出循环

这样懂了吗?楼主




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