Java学习-基础篇(4)(循环解题集 更新中...)

循环题100

1、打印九九乘法表

import java.text.MessageFormat;
public class Practise100 {
    public static void main(String[] args){
        for (int i = 1,sum; i <10 ; i++) {
            for (int j = 1; j <=i ; j++) {
                sum=j*i;
                System.out.print(MessageFormat.format("{0}*{1}+{2}",i,j,i*j));
            }
            System.out.println();
        }
    }  
}    

       代码运行结果:

1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

2、输入两个正整数m和n,求其最大公约数和最小公倍数

import java.util.Scanner;
public class Practise100 {
    public static void main(String[] args){
       Scanner input = new Scanner(System.in);
        System.out.print("请输入m的大小:");
        int max = input.nextInt();
        System.out.print("请输入n的大小:");
        int min = input.nextInt();
        for (int i = min; i >0 ; i--) {
            if(min%i==0 && max%i==0){
                System.out.print("m和n的最大公约数为:"+i);
                break;
            }
        }
        System.out.println();
        for (int i = 1; i<=min ; i++) {
            int k=max*i;
            if(k%min==0){
                System.out.print("m和n的最小公倍数为:"+(max*i));
                break;
            }
        }
    }  
}    

       代码运行结果:

请输入m的大小:36
请输入n的大小:9
m和n的最大公约数为:9
m和n的最小公倍数为:36
Process finished with exit code 0

3、搬砖问题

       搬砖问题:36 块砖,36 人搬,男搬 4,女搬 3,两个小孩抬 1 砖,要求一次全搬完,问男、女和小孩各若干?

import java.text.MessageFormat;
public class Practise100 {
    public static void main(String[] args){
        int a,b,c=0;
        for ( a=9,b=12; a>0 ; a--) {
            if(4*a+3*b+0.5*(36-a-b)!=36){
                if(b>0){
                    b--;
                    a++;}else{
                    a--;
                    b=12;
                }
            }else {
                c=36-a-b;
                System.out.print(MessageFormat.format("需要男人{0}个,女人{1}个,小孩{2}个",a,b,c));
            }
        }
    }  
}    

       代码运行结果:

需要男人3个,女人3个,小孩30个

4、猴子吃桃问题

       猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个; 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

public class Practise100 {
    public static void main(String[] args){
        int sum=1;
        for (int i = 0; i <10 ; i++) {
            sum=(sum+1)*2;
        }
        System.out.print(sum);
    }  
}    

       代码运行结果:

3070

5、打印金字塔型的数字

import java.util.Scanner;
public class Practise100 {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        System.out.print("请输入您需要打印数字金字塔的高度:");
        int height= input.nextInt();
        double y=0,z=0;
        for (int i = 0; i <= height-1; i++) {
            for (int n = height-1-i; n >0 ; n--) {
                System.out.print("\t");
            }
            for (int j = 0; j <= i; j++) {
                y = Math.pow(2, j);
                System.out.print((int) y + "\t");
                if (i == j) {
                    for (int k = j; k >= 0; k--) {
                        z = Math.pow(2, k-1);
                         if(k>0){
                            System.out.print((int)z+ "\t");
                        }else if(k==1)
                        {
                            System.out.print((int)z+"\n");
                        }
                    }
                }
            }System.out.println();
        }
    }  
}    

       代码运行结果:

请输入您需要打印数字金字塔的高度:8
							1	
						1	2	1	
					1	2	4	2	1	
				1	2	4	8	4	2	1	
			1	2	4	8	16	8	4	2	1	
		1	2	4	8	16	32	16	8	4	2	1	
	1	2	4	8	16	32	64	32	16	8	4	2	1	
1	2	4	8	16	32	64	128	64	32	16	8	4	2	1	

6、完全平方数

       一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(完全平方指用一个整数乘以自己例如11,22,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。)

import java.util.Scanner;
public class Practise100 {
    public static void main(String[] args){
       for (int j = 11; j<10000; j++) {
            for (int i = 0; i <10000; i++) {
                if(j*j==i+100){
                    for (int k = 17; k <10000; k++) {
                        if(k*k==i+100+168){
                            System.out.print(i+"\t");
                        }
                    }
                }
            }
        }
    }  
}    

       代码运行结果:

21	261	1581	

7、兔子繁殖问题

       有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对?

import java.util.Scanner;
public class Practise100 {
        int[] arr= new int[13] ;
        arr[0] =1;
        arr[1] =2;
        arr[2] =3;
        arr[3] =4;
        for (int i = 4; i <= arr.length-1; i++) {
            arr[i]= arr[i-3]*2+(arr[i-1]-arr[i-3]);
        }
        System.out.print("一对兔子12个月能繁殖成"+arr[11]+"对");
    }  
}    

       代码运行结果:

一对兔子12个月能繁殖成88对

8、年历

import java.util.Scanner;
public class Practise100 {
        //先算距起始年份的整年的总天数
        Scanner input = new Scanner(System.in);
        System.out.print("请输入需要打印日历的年份:");
        int  year =input.nextInt();
        int sum=0;
        boolean isLeadYear2= (year%4==0&&year%100!=0)||year%400==0;
        for (int i = 1900; i<year; i++) {
            boolean isLeadYear= (i%4==0&&i%100!=0)||i%400==0;
            sum += isLeadYear?366:365;
        }
        int count=sum%7;
        //开始打印
        for (int i = 1; i <=12 ; i++) {
            int day=0;
            System.out.println();
            System.out.println(year + "年" + i  + "月");
            System.out.println("一\t二\t三\t四\t五\t六\t日");
            //算出每个月1号前需要空几格
            for (int k = count % 7 ; k > 0; k--) {
                if (k == 0) {
                    break;
                } else {
                    System.out.print("\t");
                }
            }
            //判断每个月的天数
            switch(i){
                case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                    day=31;
                    break;
                case 4: case 6: case 9: case 11:
                    day=30;
                    break;
                case 2:
                    day=isLeadYear2?29:28;
                    break;
            }
            //打印时每行七个,打印至月底换行退出
            for (int j = 1; j <=day ; j++) {
                //每个月1号直接接着上个月的空格后输入即可
                if(j==1){
                    System.out.print(j);
                }else {
                    if ((j + count) % 7 == 1) {
                        System.out.print("\n" + j);
                    } else {
                        System.out.print("\t" + j);
                    }
                }
            }
            count += day;
            System.out.println();
        }
    }  
}    

       代码运行结果:

请输入需要打印日历的年份:2003

2003年1月
一	二	三	四	五	六	日
		1	2	3	4	5
6	7	8	9	10	11	12
13	14	15	16	17	18	19
20	21	22	23	24	25	26
27	28	29	30	31

2003年2月
一	二	三	四	五	六	日
					1	2
3	4	5	6	7	8	9
10	11	12	13	14	15	16
17	18	19	20	21	22	23
24	25	26	27	28

2003年3月
一	二	三	四	五	六	日
					1	2
3	4	5	6	7	8	9
10	11	12	13	14	15	16
17	18	19	20	21	22	23
24	25	26	27	28	29	30
31

2003年4月
一	二	三	四	五	六	日
	1	2	3	4	5	6
7	8	9	10	11	12	13
14	15	16	17	18	19	20
21	22	23	24	25	26	27
28	29	30

2003年5月
一	二	三	四	五	六	日
			1	2	3	4
5	6	7	8	9	10	11
12	13	14	15	16	17	18
19	20	21	22	23	24	25
26	27	28	29	30	31

2003年6月
一	二	三	四	五	六	日
						1
2	3	4	5	6	7	8
9	10	11	12	13	14	15
16	17	18	19	20	21	22
23	24	25	26	27	28	29
30

2003年7月
一	二	三	四	五	六	日
	1	2	3	4	5	6
7	8	9	10	11	12	13
14	15	16	17	18	19	20
21	22	23	24	25	26	27
28	29	30	31

2003年8月
一	二	三	四	五	六	日
				1	2	3
4	5	6	7	8	9	10
11	12	13	14	15	16	17
18	19	20	21	22	23	24
25	26	27	28	29	30	31

2003年9月
一	二	三	四	五	六	日
1	2	3	4	5	6	7
8	9	10	11	12	13	14
15	16	17	18	19	20	21
22	23	24	25	26	27	28
29	30

2003年10月
一	二	三	四	五	六	日
		1	2	3	4	5
6	7	8	9	10	11	12
13	14	15	16	17	18	19
20	21	22	23	24	25	26
27	28	29	30	31

2003年11月
一	二	三	四	五	六	日
					1	2
3	4	5	6	7	8	9
10	11	12	13	14	15	16
17	18	19	20	21	22	23
24	25	26	27	28	29	30

2003年12月
一	二	三	四	五	六	日
1	2	3	4	5	6	7
8	9	10	11	12	13	14
15	16	17	18	19	20	21
22	23	24	25	26	27	28
29	30	31

9、三角形

       循环使用方法:(D*i+X)=Y(i↑    y↑)        (X-D*i)=Y (i↑    y↓)

import java.util.Scanner;
public class Practise100 {
        //倒置直角
        for (int i = 1; i <=5 ; i++) {
            for (int j = 1; j <=6-i ; j++) {
                System.out.print("*");
            }System.out.println();
        }
        System.out.println();
        //倒置等边
        for (int j = 1; j <=5 ; j++) {
            for(int i=1;i<=j-1;i++){
                System.out.print(" ");
            }
            for (int k = 0; k <11-2*j; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println();
        //倒置等边掏空
        for (int j = 1; j <=5 ; j++) {
            for(int i=1;i<=j-1;i++){
                System.out.print(" ");
            }
            for (int k = 1; k <=11-2*j; k++) {
                boolean first = j==1 ||j==5 || k==1 || k==11-2*j;
                System.out.print(first?"*":" ");
            }
            System.out.println();
        }
        System.out.println();
        //菱形上下分开写
        for (int i = 1; i <=5 ; i++) {
            for (int j = 1; j <=5-i ; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <=2*i-1 ; j++) {
                System.out.print("*");
            }System.out.println();
        }
        for (int j = 1; j <=4 ; j++) {
            for(int i=1;i<=j;i++){
                System.out.print(" ");
            }
            for (int k = 0; k <9-2*j; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println();
        //菱形整体一起写
        for (int i = 1,k=1; i>=1; i=k++<5 ? ++i :--i) {
            for (int j = 1; j <=  5-i ; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2*i-1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println();
		//菱形(对称写法)上下对称
        for (int i = -4; i <=4 ; i++) {
            for (int j = 1; j <=Math.abs(i) ; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <=9-2*Math.abs(i) ; j++) {
                boolean first = Math.abs(i)==4|| j==1||j==9-2*Math.abs(i);
                System.out.print(first?"*":" ");
            }System.out.println();
        }
        System.out.println();
        //沙漏(对称)
        for (int i = -4; i <=4 ; i++) {
            for (int j = 1; j <=4-Math.abs(i) ; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <=2*Math.abs(i)+1 ; j++) {
                System.out.print("*");
            }System.out.println();
        };
        System.out.println();
        //沙漏掏空
        for (int i = -4; i <=4 ; i++) {
            for (int j = 1; j <=4-Math.abs(i) ; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <=2*Math.abs(i)+1 ; j++) {
                boolean first= Math.abs(i)==4||Math.abs(i)==0||j==2*Math.abs(i)+1||j==1;
                System.out.print(first?"*":" ");
            }System.out.println();
        }
    }  
}    

       代码运行结果:

*****
****
***
**
*

*********
 *******
  *****
   ***
    *

*********
 *     *
  *   *
   * *
    *

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

    *
   * *
  *   *
 *     *
*       *
 *     *
  *   *
   * *
    *

*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********

*********
 *     *
  *   *
   * *
    *
   * *
  *   *
 *     *
*********

10、数组生成后查找以及排序

       随机生成100个数,任何单值重复不超过两次,取值1~50之间的整数;找出数组中所有数值中不重复的质数;用插入排序法为数组中的数值升序排序

       第一种方法

public class Practise100 {
    public static void main(String[] args){
    //第一种方法
    	//生成数组
        for (int i = 0,t,count; i <100; i++) {
            count=0;
            t= 1+ rand.nextInt(50);
            for (int j = 0; j < i; j++) {
                if(arr[j]==t) {
                    count++;
                }
            }
            if(count<2){
                arr[i]=t;
            }else{
                i--;
                }
        }
        for (int i : arr) {
            System.out.print(i+"\t");
        }
        System.out.println();
        System.out.println();
        //找出不重复的质数
        int[] arr1 = new int[N];
        for (int i = 0,count,count1=0; i < arr.length; i++) {
            count = 0;
            count1 = 0;
            for (int j = 1; j <= arr[i]; j++) {
                if (arr[i] % j == 0) {
                    count++;
                }
            }
            if (count < 3 && count > 1) {
                for (int k = 0; k < arr1.length; k++) {
                    if(arr1[k]==arr[i]){
                        count1++;
                    }
                }
            }else{
                continue;
            }
            if(count1==0){arr1[i]=arr[i];}
        }
        for (int i = 0; i < arr1.length; i++) {
            if(arr1[i]!=0) System.out.print(arr1[i]+"\t");
        }
        System.out.println();
        System.out.println();
		//插入排序(降序排序)
		for (int i = 1,j,t; i <= arr.length-1; i++) {
            t=arr[i];
            for ( j = i-1; j >=0 && arr[j]< t ; j--) {
                arr[j+1]=arr[j];
            }
            arr[j+1] =t;
        }
        for (int i : arr) {
            System.out.print(i+"\t");
        }
    }  
}    

       第二种方法

import java.util.Random;

public class Practise100 {
    public static void main(String[] args){
    //第二种方法
    	//生成数组
        Random rand = new Random();
        final int N =100;
        int[] uqarr= new int[N];
        int[] uqcnt= new int[N];
        int[] arr =  new int[N];
        int ix=0;
        for (int i = 0,t,tx; i < arr.length;) {
            t=1+rand.nextInt(50);
            tx=-1;
            for (int j = 0; j <ix ; j++) {
                if(t==uqarr[j]){
                    tx=j;
                    break;
                }
            }
            if(tx!=-1 &&uqcnt[tx]>=2){ continue;}
            arr[i++]=t;
            if(tx==-1){
                uqarr[ix]=t;
                uqcnt[ix++]++;
            }else{uqcnt[tx]++;}
        }
        for (int i = 0; i < ix ; i++) {
            System.out.println(uqarr[i]+":"+uqcnt[i]);
        }
       for (int i : arr) {
            System.out.print(i+"\t");
        } 
        System.out.println();
        System.out.println();
        //找出不重复的质数
        for (int i = 0,t=0; i < ix; i++) {
            if(uqarr[i]==1)continue;
            t=uqarr[i];
            boolean isPrime = true;
            for (int j = 2; j <=Math.sqrt(t) ; j++) {
                if(t%j==0){
                    isPrime=false;
                    break;
                }
            }
            if(isPrime==true){
                System.out.print(t+"\t");
            }
        }
        System.out.println();
        System.out.println();
		//插入排序(降序排序)
		for (int i = 1,j,t; i <= arr.length-1; i++) {
            t=arr[i];
            for ( j = i-1; j >=0 && arr[j]< t ; j--) {
                arr[j+1]=arr[j];
            }
            arr[j+1] =t;
        }
        for (int i : arr) {
            System.out.print(i+"\t");
        }
    }  
}    

       代码运行结果:

16	50	33	10	12	33	6	7	42	18	23	34	21	15	27	4	39	37	8	24	12	36	44	28	4	45	37	15	22	43	40	30	46	48	42	46	49	11	14	31	14	19	44	34	38	2	3	38	5	9	20	35	18	47	31	5	48	17	28	19	20	27	6	11	36	3	22	47	40	49	32	17	13	2	30	1	7	41	24	16	23	25	1	10	41	50	32	25	9	21	45	43	8	35	29	39	29	13	26	26	

7	23	37	43	11	31	19	2	3	5	47	17	13	41	29	

50	50	49	49	48	48	47	47	46	46	45	45	44	44	43	43	42	42	41	41	40	40	39	39	38	38	37	37	36	36	35	35	34	34	33	33	32	32	31	31	30	30	29	29	28	28	27	27	26	26	25	25	24	24	23	23	22	22	21	21	20	20	19	19	18	18	17	17	16	16	15	15	14	14	13	13	12	12	11	11	10	10	9	9	8	8	7	7	6	6	5	5	4	4	3	3	2	2	1	1	

11、奇数偶数分离(二分法思想)

       随机生成一个长度为20,取值1~100之内的整数数组,将其中奇偶数分离出来,奇左偶右?

import java.util.Random;

public class Practise100 {
    public static void main(String[] args){
        int[] arr = new int[20];
        Random rand = new Random();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 1 + rand.nextInt(100);
        }
        int begin = 0, end = arr.length - 1,t;
        while (begin < end) {
            if (arr[end] % 2 == 0) {
                end--;
            } else {
                if (arr[begin]%2==1) {
                    begin++;
                }else{
                    t=arr[begin];
                    arr[begin]=arr[end];
                    arr[end]=t;
                }
            }
        }
        for (int i : arr) {
            System.out.print(i+"\t");
        }
    }  
}    

       代码运行结果:

35	27	85	85	45	15	67	35	87	79	95	74	22	68	100	28	40	32	28	66	

PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!

原创作者:wsjslient

作者主页:https://blog.csdn.net/wsjslient


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值