流程控制语句习题总结(二)

这次我们来说剩下的几道题,后面的题都挺简单的,让我们一起来看看吧!

思路分析:这道题是找n1和n2除了1以外的最大的公约数,其实步骤题目当中也给出我们了,只需按照步骤一步一步来就行了,具体来看吧。

第一步:输入两个整数n1和n2,将gcd初始化为1;

第二步:判断n1和n2的大小,再进行计算,具体过程详见代码;

第三步:编写代码。

import java.util.*;
public class Demo03_12{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入两个数:");
        int n1 = scanner.nextInt();
        int n2 = scanner.nextInt();
        int gcd = 1;
        for(int i=n1<n2?n1:n2;i>=1;i--){
            if(n1%i==0 && n2%i==0){
                gcd = i;
                break;
            }
        }
        System.out.println(n1 + "和" + n2 + "的最大公约数是" + gcd);
    }
}

运行结果:

输入两个数:24 48
24和48的最大公约数是24
输入两个数:1 5
1和5的最大公约数是1

思路分析:这道题很短,其实也不难,它是让我们输入一个整数,然后升序显示它的所有最小因子,很简单,一个循环就够了,直接来看代码吧。

import java.util.*;
public class Demo03_13{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入一个整数:");
        int num = scanner.nextInt();
        while(true){
            for(int i=2;i<=num;i++){
                if(num%i==0){
                    System.out.print(i+" ");
                    num/=i;
                    break;
                }
            }    
            if(num==1){
                break;
            } 
        }
    }
}

运行结果:

输入一个整数:120
2 2 2 3 5

第一步:行数定为line,这需要用到for循环;

第二步:紧接着我们要用循环输出空格。因为每个数字和每个数字之间都要有空格来分开;

第三步:分析每行数字之间的规律,需要用到绝对值;

第四步:编写代码。

/*
 4  3  2  1 2 3 4
-3 -2 -2  0 1 2 3
第4行 x∈[-3,3] y=|x|+1
第5行 x∈[-4,4] y=|x|+1
*/
import java.util.*;
class Demo03_14{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the line number:");
        int line = scanner.nextInt();
        for(int i = 1;i < line;i++){
            for(int k = 1;k<line-i;k++){
                System.out.print("    ");//每循环一次打印四个空格
            }
            for(int j=-(i-1);j<=i-1;j++){
                double a = Math.abs(j) + 1;
                System.out.printf("%4.0f",a);//格式化输出,每个数字占4个大小
            }
            System.out.println();
        }
    }
}

运行结果:

Enter the line number:8
                           1
                       2   1   2
                   3   2   1   2   3
               4   3   2   1   2   3   4
           5   4   3   2   1   2   3   4   5
       6   5   4   3   2   1   2   3   4   5   6
   7   6   5   4   3   2   1   2   3   4   5   6   7

这道题跟上一道题其实差不多,分析规律都是一样的,就不再多说了。为了方便起见,每一个图案输出完之后我加了个分隔符。

public class Demo03_15{
    public static void main(String[] args){
        for(int i = 1;i <= 6;i++){
            for(int j = 1;j <= i;j++){
                System.out.print(j + " ");
            }
            System.out.println();
        }
        System.out.println("===============");
        for(int i = 6;i >= 1;i--){
            for(int j = 1;j <= i;j++){
                System.out.print(j + " ");
            }
            System.out.println();
        }
        System.out.println("===============");
        for(int i = 1;i <= 6;i++){
            for(int k = 1;k <= 6-i;k++){
                System.out.print("  ");
            }
            for(int j = i;j >= 1;j--){
                System.out.print(j + " ");
            }
            System.out.println();
        }
        System.out.println("===============");
        for(int i = 6;i >= 1;i--){
            for(int k = 1;k <= 6-i;k++){
                System.out.print("  ");
            }
            for(int j = 1;j <= i;j++){
                System.out.print(j + " ");
            }
            System.out.println();
        }
    }
}

运行结果:

1 
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 
===============
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
===============
          1
        2 1
      3 2 1
    4 3 2 1
  5 4 3 2 1
6 5 4 3 2 1
===============
1 2 3 4 5 6
  1 2 3 4 5
    1 2 3 4
      1 2 3
        1 2
          1

这道题和前面两道题分析和步骤也是一模一样的,只需找一行来分析规律,大概的分析步骤我写在代码中。

/*分析规律:
第4行  
         1  2  4 8 4 2 1
         0  1  2 3 2 1 0
      x -3 -2 -1 0 1 2 3
第5行
        1 2 4 8 16 8 4 2 1
        0 1 2 3 4  3 2 1 0
    x  -4-3-2-1 0  1 2 3 4
*/
public class Demo03_16{
    public static void main(String[] args){
        for(int i = 1;i<=8;i++){
            for(int k = 1;k<=8-i;k++){
                System.out.print("    ");
            }
            for(int x = -(i-1);x<=i-1;x++){
                System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
            }
            System.out.println();
        }
    }
}

运行结果:

                              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

思路分析:这道题是让我们打印区间[2,100]之间的素数,素数就是除了1和它本身以外没有其他的因数,这样的数我们把它称为素数,具体来看吧。

第一步:要判断2-1000之间的数是不是素数,我们需要用到for循环遍历每一个数;

第二步:判断每一个数有没有其他的因数时我们只需要判断它长度的1/2就可以了;

第三步:用一个count记录素数的个数,最后8个一换行;

第四步:另外我们还需要定义一个布尔类型的变量来表示每一个数是不是素数;

第五步:编写代码。

public class Demo03_17{
	public static void main(String[] args) {
		int count = 0;//当前素数的个数
		boolean flag = true;//true为素数,false不是素数
		for(int num = 2;num<=1000;num++){//将2-1000之间的num进行遍历		
			for(int m = 2; m<=num/2;m++){
				if(num % m == 0){
					flag = false;
					break;
				}
			}
			if(flag){
                count++;
				System.out.print(num + " ");
				if(count%8 == 0){
					System.out.println();
			    }
			}
			flag = true;//flag重新初始化为true
		}
	}
}

运行结果:

2 3 5 7 11 13 17 19 
23 29 31 37 41 43 47 53         
59 61 67 71 73 79 83 89         
97 101 103 107 109 113 127 131  
137 139 149 151 157 163 167 173 
179 181 191 193 197 199 211 223 
227 229 233 239 241 251 257 263
269 271 277 281 283 293 307 311
313 317 331 337 347 349 353 359
367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457
461 463 467 479 487 491 499 503
509 521 523 541 547 557 563 569
571 577 587 593 599 601 607 613
617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719
727 733 739 743 751 757 761 769
773 787 797 809 811 821 823 827
829 839 853 857 859 863 877 881
883 887 907 911 919 929 937 941
947 953 967 971 977 983 991 997

后面的几道题都很简单,所以我就大致的说一下思路就好了,具体步骤就不再详述。

 

思路分析:这道题中的i可以我们直接给定,也可以让用户输入,我是直接给定的,定义一个flag变量表示分子,每循环一次给它取反,就可以进行题目中的正负数相加的计算,具体来看代码。

class Demo03_18{
    public static void main(String[] args){
        double PI = 0;
        double flag = 1;
        for(int i=0;i<1000000000;i++){
            PI = PI + flag / (2 * i + 1);
            flag = -flag;
        }
        PI *= 4;
        System.out.println(PI);
    }
}

运行结果:

3.1415926525880504

 

思路分析:这道题和上道题目差不多,这道题当中的i我是让用户输入的。我们把i的最大值定义为iMax,按照题目中所说的,我们定义一个item变量,因为第一个1不太好直接计算,所以给它初始值定为1,然后i!=i*(i-1)!我们就可以表示为item = item * i,这样就好算很多,来看代码。

import java.util.*;
class Demo03_19{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入i的值:");
        int iMax = scanner.nextInt();
        double item = 1.0;
        double e = 1;
        for(int i=1;i<=iMax;i++){
            item = item * i;   // i!=i*(i-1)!
            e+=1/item;
        }
        System.out.println(e);
    }
}

运行结果:

请输入i的值:10000000
2.7182818284590455

 

思路分析:闰年的判断条件是(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0),知道这个就很容易计算,再定义一个count来记录闰年的数目,每10个一换行,具体来看代码。

public class Demo03_20{
	public static void main(String[] args){
		int count = 0;
		for(int year = 101; year <= 2100; year++){
			if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
                count++;
                System.out.print(year + " ");
                if(count%10==0){
                    System.out.println();
                }
            }
		}
		System.out.println("\nThe number of leap year is " + count);
	}
}

运行结果:

104 108 112 116 120 124 128 132 136 140 
144 148 152 156 160 164 168 172 176 180
184 188 192 196 204 208 212 216 220 224
228 232 236 240 244 248 252 256 260 264
268 272 276 280 284 288 292 296 304 308
312 316 320 324 328 332 336 340 344 348
352 356 360 364 368 372 376 380 384 388
392 396 400 404 408 412 416 420 424 428 
432 436 440 444 448 452 456 460 464 468
472 476 480 484 488 492 496 504 508 512
516 520 524 528 532 536 540 544 548 552
556 560 564 568 572 576 580 584 588 592
596 604 608 612 616 620 624 628 632 636
640 644 648 652 656 660 664 668 672 676
680 684 688 692 696 704 708 712 716 720
724 728 732 736 740 744 748 752 756 760
764 768 772 776 780 784 788 792 796 800
804 808 812 816 820 824 828 832 836 840
844 848 852 856 860 864 868 872 876 880 
884 888 892 896 904 908 912 916 920 924
928 932 936 940 944 948 952 956 960 964
968 972 976 980 984 988 992 996 1004 1008
1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 
1052 1056 1060 1064 1068 1072 1076 1080 1084 1088
1092 1096 1104 1108 1112 1116 1120 1124 1128 1132
1136 1140 1144 1148 1152 1156 1160 1164 1168 1172
1176 1180 1184 1188 1192 1196 1200 1204 1208 1212
1216 1220 1224 1228 1232 1236 1240 1244 1248 1252
1256 1260 1264 1268 1272 1276 1280 1284 1288 1292
1296 1304 1308 1312 1316 1320 1324 1328 1332 1336
1340 1344 1348 1352 1356 1360 1364 1368 1372 1376
1380 1384 1388 1392 1396 1404 1408 1412 1416 1420
1424 1428 1432 1436 1440 1444 1448 1452 1456 1460
1464 1468 1472 1476 1480 1484 1488 1492 1496 1504
1508 1512 1516 1520 1524 1528 1532 1536 1540 1544
1548 1552 1556 1560 1564 1568 1572 1576 1580 1584
1588 1592 1596 1600 1604 1608 1612 1616 1620 1624
1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 
1668 1672 1676 1680 1684 1688 1692 1696 1704 1708
1712 1716 1720 1724 1728 1732 1736 1740 1744 1748
1752 1756 1760 1764 1768 1772 1776 1780 1784 1788
1792 1796 1804 1808 1812 1816 1820 1824 1828 1832
1836 1840 1844 1848 1852 1856 1860 1864 1868 1872
1876 1880 1884 1888 1892 1896 1904 1908 1912 1916
1920 1924 1928 1932 1936 1940 1944 1948 1952 1956
1960 1964 1968 1972 1976 1980 1984 1988 1992 1996
2000 2004 2008 2012 2016 2020 2024 2028 2032 2036
2040 2044 2048 2052 2056 2060 2064 2068 2072 2076
2080 2084 2088 2092 2096
The number of leap year is 485

 

思路分析:定义一个sum存放完全数拆成的数字之和,初始值定为0。for循环i从2到10000遍历,再来一个for循环,从1到i/2,这是看一个数有没有其他的因数,再判断i%j是否为0,如果为0,把它赋给sum,依次再循环,最后判断sum和i的值,如果相等,就证明这个数是完全数,然后输出,再把sum重新初始化为0。具体来看代码。

class Demo03_21{
    public static void main(String[] args){
        int sum = 0;
        for(int i = 2;i<=10000;i++){
            for(int j = 1;j<=i/2;j++){
                if(i % j==0){
                    sum+=j;
                }
            }
            if(sum==i){
                System.out.println(i);
            }
            sum = 0;
        }
    }
}

运行结果:

6
28
496
8128

 

思路分析:这道题和前面一道题差不多,只需要加两个统计次数的变量,最后再判断一下谁赢就好了,来看代码。

import java.util.*;
class Demo03_22{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        Random random=new Random();
        int usrCount=0;
        int comCount=0;
        int com=0;
        int usr=0;
        while(true){
            com=random.nextInt(3);
            System.out.print("请输入 剪刀0 石头1 布2:");
            usr=scanner.nextInt();
            String usrStr = "";
            String comStr = "";
            switch(usr){
                case 0:
                    usrStr = "scissor"; 
                    break;
                case 1:
                    usrStr = "rock";
                    break;
                case 2:
                    usrStr = "paper";
                    break;
            }
            switch(com){
                case 0: 
                    comStr = "scissor"; 
                    break;
                case 1:
                    comStr = "rock";
                    break;
                case 2:
                    comStr = "paper";
                    break;
            }
            if(usr==com){
                System.out.printf("The computer is %s.you are %s too.It is a draw\n",comStr,usrStr);
            }else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
                System.out.printf("The computer is %s.you are %s.You won\n",comStr,usrStr);
                usrCount++;
            }else{
                System.out.printf("The computer is %s.you are %s.You lost\n",comStr,usrStr);
                comCount++;
            }
            if(usrCount>=3||comCount>=3){
                break;
            }
        }
        if(usrCount==3){
            System.out.println("最终用户赢");
        }else{
            System.out.println("最终电脑赢");
        }
    }
}

运行结果:

请输入 剪刀0 石头1 布2:1
The computer is rock.you are rock too.It is a draw
请输入 剪刀0 石头1 布2:1
The computer is paper.you are rock.You lost
请输入 剪刀0 石头1 布2:1
The computer is rock.you are rock too.It is a draw
请输入 剪刀0 石头1 布2:2
The computer is scissor.you are paper.You lost
请输入 剪刀0 石头1 布2:3
The computer is rock.you are .You lost
最终电脑赢

 

思路分析:这道题是将10进制数字转换成二进制数字,这里我们需要定义一个字符串将数字每次短除2后的余数倒着拼接起来,具体来看代码。

import java.util.Scanner;
public class Demo03_23{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter an integer: ");//integer整数
        int decimal = scanner.nextInt();//decimal十进制  
        String binaryString = "";//binary二进制
        while (decimal != 0) {
            binaryString = decimal % 2 + binaryString;
            decimal = decimal / 2;
        }           
        System.out.println(decimal + "'s 二进制表示 is " + binaryString);
    }
}

运行结果:

Enter an integer: 23
0's 二进制表示 is 10111

 

思路分析:题目当中的题示已经很详细的说明了,我们直接来看代码。

import java.util.*;
class Demo03_24{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter numbers: ");
        int max = 0;
        int count = 0;
        int num = 0;
        while(true){
            num = scanner.nextInt();
            if(num == 0){
                break;
            }
            if(num > max){
                max = num;
                count = 1;
            }else if(num == max){
                count++;
            }
        }
        System.out.println("max="+max+",count="+count);

    }
}

运行结果:

Enter numbers: 2 3 5 5 6 8 8 0
max=8,count=2

好了,到目前为止,我们流程控制语句的24道练习题就已经说完了,谢谢大家! 

发布了18 篇原创文章 · 获赞 25 · 访问量 3868

猜你喜欢

转载自blog.csdn.net/Agonyq/article/details/104237585
今日推荐