zoukankan      html  css  js  c++  java
  • 3.09课·········for穷举和迭代

    for循环拥有两类:穷举和迭代
    穷举:
    把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况。

    1.单位给发了一张150元购物卡,拿着到超市买三类洗化用品。洗发水15元,香皂2元,牙刷5元。求刚好花完150元,有多少种买法,没种买法都是各买几样?

     int sum = 0;//共走了多少步
                int s = 0;//共有几种买法
                for (int x = 0; x <= 10;x++ )
                {
                    for(int y=0;y<=75;y++)
                    {
                        for (int z = 0; z <= 30;z++ )
                        {
                            sum++;
                         if(x*15+y*2+z*5==150)
                         {
                             s++;
                             Console.WriteLine("这是第"+s+"种买法:"+"洗发水"+x+"瓶,香皂"+y+"块,牙刷"+z+"支.");
                         }
                        }
                    
                    
                    }
                }
                Console.WriteLine("一共"+s+"种买法.");
                Console.WriteLine(sum);
                Console.ReadLine();

    2.百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100文钱(每种鸡至少一只)?

    int sum = 0;
                int s = 0;
                for(int x=1;x*2<=100;x++)
                {
                    for(int y=1;y*1<=100;y++)
                    {
                        for (int z = 1; z*0.5 <= 100;z++ )
                        {
                            sum++;
                            if(x*2+y*1+z*0.5==100&&x+y+z==100)
                            {
                                s++;
                                Console.WriteLine("这是第"+s+"种买法:公鸡"+x+"只,母鸡"+y+"只,小鸡"+z+"");
                            }
                        }
                    }
                }
                Console.WriteLine("共有"+s+"种买法.");
                Console.WriteLine(sum);
                Console.ReadLine();            

    3.大马驼2石粮食,中等马驼1石粮食,两头小马驼1石粮食,要用100匹马,驼100石粮食,该如何分配?

     int s = 0;
                for(int x=0;x*2<=100;x++)
                {
                    for(int y=0;y<=100;y++)
                    {
                        for (int z = 0; z*0.5 <= 100;z++ )//不能写成z/2<=100;
                        {
                            if(x*2+y*1+z*0.5==100&&x+y+z==100)
                            {
                                s++;
                                Console.WriteLine("这是第"+s+"种分配方法:"+x+"匹大马,"+y+"匹中等马,"+z+"匹小马.");
                            }
                        }
                    }
                }
                Console.WriteLine("共有"+s+"种分配方法.");
                Console.ReadLine();

     4.有1分钱,2分钱,5分钱的硬币,要组合出来2角钱,有几种组合方式,分别各多少个? 

                int s = 0;
                int sum = 0;
                for (int x = 0; x <= 20; x++)
                {
                    for (int y = 0; y <= 10; y++)
                    {
                        for (int z = 0; z <= 4; z++)
                        {
                            sum++;
                            if (x + y * 2 + 5 * z == 20)
                            {
                                s++;
                                Console.WriteLine("这是第" + s + "种组合方式:1分钱" + x + "枚,2分钱" + y + "枚,5分钱" + z + "枚.");
                            }
                        }
                    }
                }
                Console.WriteLine("共有" + s + "种组合方式");
                Console.WriteLine(sum);
                Console.ReadLine();

    迭代:
    从初始情况按照规律不断求解中间情况,最终推导出结果。

    1.五个小朋友排成一队,问第一个多大了,第一个说比第二个大两岁,问第二个多大了,第二个说比第三个大两岁。。。以此类推,问第5个小朋友,说自己3岁了。问第一个小朋友几岁了?

    int age = 3;
                int i = 2;
                for (; ; )
                {
                    age += 2;
                    if(i==5)
                    {
                        Console.WriteLine("第五个小朋友"+age+"岁了.");
                        break;
                    }
                    i++;
                }
                Console.ReadLine();

    2.纸张可以无限次对折,纸张厚度为0.07毫米。问多少次对折至少可以超过8848?

    int a = 7;//884800000//统一单位
                int i = 1;
                for (; ; )//
                {
                    a *= 2;//a=a*2;
                    if (a >= 884800000)
                    {                   
                        break;//满足条件后跳出for循环
                    }
                    i++;
                }
                Console.WriteLine("对折"+i+"次可超过8848米");
                Console.WriteLine("此时纸张厚度为:"+a+"毫米");
                Console.ReadLine();

    while 循环
    其实是for循环的变形写法
    for(int i = 1; i<=5;i++)
    {
    循环体;
    }
    上面的for循环可以写成
    int i= 1;
    for(;i<=5;)
    {
        循环体;
        i++;
    }
    写成while就是以下样式
    int i= 1;
    while(表达式(i<=5))
    {
        循环体;
        状态改变(i++);
    }

    如上题可用while循环:

                 int a = 7;
                int i = 1;
                while(true)
                {
                    a *= 2;
                    if(a>=884800000)
                    {                   
                        break;
                    }
                    i++;
                }
    
                Console.WriteLine("对折" + i + "次可超过8848米");
                Console.WriteLine("此时纸张厚度为:" + a + "毫米");
                Console.ReadLine();

    do
    {
        循环体;
        状态改变(i++);
    }while(表达式(i<=5))
    注意:do while是不管满不满足表达式,我都会先执行一遍。


    跳转语句:
    break:跳出整个循环
    continue:跳出本次循环,继续下次循环。

  • 相关阅读:
    dubbo和spring的@service注解区别
    mybatisplus乐观锁
    mybatis中llike模糊查询中#和$的使用,以及bind标签的使用
    mybatis的两个内置参数
    mybatis返回主键
    mybatis使用foreach进行批量保存
    jsp自定义标签
    java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
    junit测试框架
    junit断言和junit注释assert
  • 原文地址:https://www.cnblogs.com/xinghun/p/5264158.html
Copyright © 2011-2022 走看看