2020年7月27日 练习题4、5、6、7、8、9、12

/*
4、随机生成一个100以内的整数,猜数字游戏
从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,
并统计一共猜了多少次
*/
class Test09_Exer4{
    public static void main(String[] args){
        //随机生成一个100以内的整数,[0,100)
        /*
        Math.random() -->[0,1)的小数
        Math.random()*100 -->[0,100)的小数
        [0,100)的整数 (int)(Math.random()*100 )
        */
        int randNum = (int)(Math.random()*100);
    //    System.out.println(randNum);
        
        //从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,
        java.util.Scanner input = new java.util.Scanner(System.in);
        int num;//挪到do{}上面,提升作用域
        int count = 0;//统计次数
        do{
            System.out.print("猜数(范围[0,100):");
            num = input.nextInt();
            
            count++;//输入一次,就代表猜一次
            
            if(num > randNum){
                System.out.println("大了");
            }else if(num<randNum){
                System.out.println("小了");
            }
        }while(num!=randNum);//条件成立,重复执行循环体语句
        
        System.out.println("一共猜了:" + count + "次");
    }
}
/*
循环嵌套:

5、输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
    例如: 153 = 1*1*1 + 5*5*5 + 3*3*3 
*/
class Test16_Exer5{
    public static void main(String[] args){
        //所谓水仙花数是指一个3位数==>[100,999]
        //百位:1-9
        //十位:0-9
        //个位:0-9
        
        /*
        当bai=1, shi会从0变到9整个来一轮
        当shi=0,ge会从0变到9整个来一轮
        */
        for(int bai = 1; bai<=9; bai++){
            for(int shi = 0; shi<=9; shi++){
                for(int ge = 0; ge<=9; ge++){
                    if(bai*bai*bai + shi*shi*shi + ge*ge*ge == bai*100+shi*10+ge){
                        System.out.println(bai*100+shi*10+ge);
                    }
                }
            }
        }
    }
}
/*
6、从1循环到150并在每行打印一个值,
另外在每个3的倍数行上打印出“foo”,在每个5的倍数行上打印“biz”,
在每个7的倍数行上打印输出“baz”。
*/
class Test07_Exer6{
    public static void main(String[] args){
        //从1循环到150
        for(int i=1; i<=150; i++){
            //在每行打印一个i的值
            //System.out.println(i);//输出i之后,立刻换行
            System.out.print(i);//只打印i的值
            
            //每个3的倍数行上打印出“foo”
            if(i%3==0){
                //System.out.println("foo");//输出foo后立刻换行
                System.out.print("\tfoo");//这里加\t是为了好看
            }
            
            //在每个5的倍数行上打印“biz”
            if(i%5==0){
                System.out.print("\tbiz");
            }
            
            //在每个7的倍数行上打印输出“baz”
            if(i%7==0){
                System.out.print("\tbaz");
            }
            
            //最后把这一行的事全部完成后,再换行
            //System.out.print("\n");
            System.out.println();//只打印换行
        }
    }
}
/*
7、输入两个正整数m和n,求其最大公约数和最小公倍数
*/
class Test14_Exer7{
    public static void main(String[] args){
        //输入两个正整数m和n
        java.util.Scanner input = new java.util.Scanner(System.in);
        
        int m;
        while(true){
            System.out.print("请输入第一个正整数m的值:");
            m = input.nextInt();
            if(m<=0){
                System.out.println(m + "不是正整数,请重写输入!");
            }else{
                break;
            }
        }
        int n;
        while(true){
            System.out.print("请输入第一个正整数n的值:");
            n = input.nextInt();
            if(n<=0){
                System.out.println(n + "不是正整数,请重写输入!");
            }else{
                break;
            }
        }
        
        System.out.println("两个正整数:" + m + "," + n);
        
        //求m和n的最大公约数和最小公倍数
        /*
        1、概念
        公约数:能够把m和n都整除,就是它俩的公约数
        例如:6和9,公约数:1,3
              9和18,公约数:1,3,9
              5和13,公约数:1
        公倍数:能够被m和n都整除的,就是它俩的公倍数
        例如:6和9,公倍数:18,36....
               9和18,公倍数:18,36...
                5和13,公倍数:65,....
        
        2、如何找最大公约数
        例如:6和9
            从6开始,9%6==0?  6%6==0?
                     9%5==0?   6%5==0?
                     9%4==0?   6%4==0?
                     9%3==0?   6%3==0?    binggou找到了  结束查找
        例如:9和18
            从9开始      9%9==0?  18%9==0?   binggou找到了  结束查找
        例如:5和13
            从5开始   5%5==?  13%5==0?
                      5%4==?  13%4==0?
                      5%3==?  13%3==0?
                      5%2==?  13%2==0?
                      5%1==?  13%1==0?   binggou找到了  结束查找
                    其实只要找到5的平方根就可以了
        */
        
        //第一步:找出m和n中最大值和最小值
        int max = m>=n ? m : n;
        int min = m<n ? m : n;
        
        //第二步:从小的开始查找
        //这里的1也可以修改为min的平方根
        int maxYue = 1;
        for(int i=min; i>=1; i--){
            //看i是否能够同时把m和n都整除
            if(m%i==0 && n%i==0){
                maxYue = i;
                break;
            }
        }
        System.out.println(maxYue +"是" + m + "和" + n + "的最大公约数");
        
        //最小公倍数 = m*n / 最大公约数
        //System.out.println(m*n/maxYue +"是" + m + "和" + n + "的最小公倍数"); 
        
        //如果不知道这个公式
        //从max开始找,一直找到m*n
        for(int i=max; i<=m*n; i++){
            if(i%m==0 && i%n==0){
                System.out.println(i +"是" + m + "和" + n + "的最小公倍数"); 
                break;
            }
        }
    }
}
/*
8、打印1-100之间数,其中3、5、7的倍数不打印
*/
class Test13_Exer8{
    public static void main(String[] args){
        /*
        不使用continue
        */
        for(int i=1; i<=100; i++){
            //其中3、5、7的倍数不打印
            //如果这个数不是3,5,7的倍数就打印
            if(i%3!=0 && i%5!=0 && i%7!=0){
                System.out.println(i);
            }
        }
        System.out.println("-----------------------");
        /*
        使用continue
        */
        for(int i=1; i<=100; i++){
            //其中3、5、7的倍数不打印
            //如果是3,5,7的倍数就跳过打印语句
            if(i%3==0 || i%5==0 || i%7==0){
                //break;//如果用break,那么只打印1和2
                continue;
            }
            System.out.println(i);
        }
    }
}
/*
9、一个数如果恰好等于它的因子之和,这个数就称为"完数"。(因子:除去这个数本身的约数)
例如6=1+2+3.编程 找出1000以内的所有完数
*/
class Test17_Exer9{
    public static void main(String[] args){
        //找出1000以内的所有完数
        for(int i=1; i<1000; i++){
            //判断i是否是完数,如果是就打印i
            /*
            完数?
                一个数如果恰好等于它的因子之和
                例如:6的因子:1,2,3
                    1,2,3,6是6的约数,能够把6给整除了
                    因子:除了6本身以外的约数
                例如:18的因子:1,2,3,6,9
            如何判断i是否是完数?
            (1)先找出i的所有的因子,并且累加它的所有的因子
            (2)判断因子之和与i是否相等,如果相等就是完数
            */
            
            //(1)先找出i的所有的因子,并且累加它的所有的因子
            int iSum = 0;
            for(int j=1; j<i; j++){
                //如果j能够把i整除了,j就是i的因子
                if(i%j==0){
                    iSum += j;
                }
            }
            
            //(2)判断因子之和与i是否相等,如果相等就是完数
            if(i == iSum){
                System.out.println(i);
            }
        }
    }
}
//12、找出1-100之间所有的素数(质数)
class Test18_Exer12{
    public static void main(String[] args){
        //找出1-100之间所有的素数(质数)
        //1-100之间
        for(int i=1; i<=100; i++){
            //里面的代码会运行100遍
            //每一遍i的值是不同的,i=1,2,3,4,5...100
            //每一遍都要判断i是否是素数,如果是,就打印i
            /*
            如何判断i是否是素数
            (1)找出i的所有的约数,并累加它们的和
            例如:
                i=5,它的约数有1和5,约数和:6
                i=11,它的约数有1和11,约数和:12
                i=18,它的约数有1,2,3,6,9,18,约数和:39
            (2)如果某个i的约数和 == i+1,那么i就是素数
            */
            //(1)找出i的所有的约数,并累加它们的和
            int iSum = 0;
            for(int j=1; j<=i; j++){
                if(i%j==0){
                    //j是i的约数
                    iSum += j;
                }
            }
            //(2)如果某个i的约数和 == i+1,那么i就是素数
            if(iSum == i+1){
                System.out.println(i);
            }
            
        }
    }
}

//12、找出1-100之间所有的素数(质数)
class Test18_Exer12_2{
    public static void main(String[] args){
        //找出1-100之间所有的素数(质数)
        //1-100之间
        for(int i=1; i<=100; i++){
            //里面的代码会运行100遍
            //每一遍i的值是不同的,i=1,2,3,4,5...100
            //每一遍都要判断i是否是素数,如果是,就打印i
            /*
            如何判断i是否是素数
            (1)找出i在[2,i-1]之间的约数的个数
            (2)如果这个个数是0,那么i就是素数
            */
            int iCount = 0;
            for(int j=2; j<i; j++){
                if(i%j==0){//j是i在[2,i-1]之间的约数
                    iCount++;
                }
            }
            
            //(2)如果这个个数是0,那么i就是素数
            if(iCount == 0){
                System.out.println(i);
            }
        }
    }
}
//12、找出1-100之间所有的素数(质数)
class Test18_Exer12_3{
    public static void main(String[] args){
        //找出1-100之间所有的素数(质数)
        //1-100之间
        for(int i=1; i<=100; i++){
            //里面的代码会运行100遍
            //每一遍i的值是不同的,i=1,2,3,4,5...100
            //每一遍都要判断i是否是素数,如果是,就打印i
            /*
            如何判断i是否是素数
            (1)假设i是素数
            boolean flag = true;//true代表素数
            (2)找i不是素数的证据
            如果在[2,i-1]之间只要有一个数能够把i整除了,说明i就不是素数
            修改flag = false;
            (3)判断这个flag
            */
            
            //(1)假设i是素数
            boolean flag = true;//true代表素数
            //(2)找i不是素数的证据
            for(int j=2; j<i; j++){
                if(i%j==0){
                    flag = false;//找到一个就可以了
                    break;
                }
            }
            //(3)判断这个flag
            if(flag){
                System.out.println(i);
            }
        }
    }
}

 

//12、找出1-100之间所有的素数(质数)class Test18_Exer12_2{public static void main(String[] args){//找出1-100之间所有的素数(质数)//1-100之间for(int i=1; i<=100; i++){//里面的代码会运行100遍//每一遍i的值是不同的,i=1,2,3,4,5...100//每一遍都要判断i是否是素数,如果是,就打印i/*如何判断i是否是素数(1)找出i在[2,i-1]之间的约数的个数(2)如果这个个数是0,那么i就是素数*/int iCount = 0;for(int j=2; j<i; j++){if(i%j==0){//j是i在[2,i-1]之间的约数iCount++;}}//(2)如果这个个数是0,那么i就是素数if(iCount == 0){System.out.println(i);}}}}

posted @ 2020-07-27 22:20  窦云鹏  阅读(236)  评论(0编辑  收藏  举报