最近遇到的基础Java编程题

本文精选了六个经典编程问题,包括质因数分解、求最大公约数与最小公倍数、乒乓球比赛配对、杨辉三角形打印、约瑟夫环问题及菱形图案绘制。通过这些题目,读者可以加深对循环、数组、条件判断等基本编程概念的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【程序1】题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

public class Programme4 {

 

    public static void main(String[] args) {

       System.out.print("请输入一个你要分解的正整数:");

       Scanner scanner=new Scanner(System.in);

       int input=scanner.nextInt();//获取输入的数字

       System.out.println();

       System.out.print(input+"=");

       for (inti = 2; i < input+1; i++) {             

          

           while(input%i==0&&input!=i) {

              input=input/i;

              System.out.print(i+"*");          

           }  

           if(input==i){//上面的都不能整除,说明这是一个质数

              System.out.print(i);

              break;

           }         

       }         

       scanner.close();

    }  

}

 

【程序2】

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

程序分析:利用辗除法。 

 *这里有一个知识点要记住的,最大公约数和最小公倍数的求法  

 *1、先求最大公约数bigDivisor

 *2、就可以很方便获得最小公倍数multiple=input1*input2/bigDIvisor

 *这里最重要的就是求最大公约数:求法如下 

 *(1)用大的数对小的数求余

 *(2)把小的数赋值给大的数,把求余获得的结果赋值给小的数,

 *(3)循环上一步的操作,直到求余的结果为零

 *(4)上一步被求余的数就是我们要的最大公约数,不信的话,你可以动手试试

 

public class Programme6 {

 

    public static void main(String[] args) {

       int bigDivisor=0;//定义最大公约数

       int multiple=0;//定义最小公倍数

       System.out.println("请输入两个整数:");

       Scanner scanner = new Scanner(System.in);

       int input1 = scanner.nextInt();//获取第一个数

       int input2 = scanner.nextInt();//获取第二个数

       multiple=input1*input2;//这个值保存,求公约数后,方便求得最小公倍数

       int temp =1;// 交换用的中间数

      

       if (input2 >input1) {//确保第一个数不小于第二个数

           temp=input1;

           input1=input2;

           input2=temp;

       }

      

       while (temp!=0) { //求余结果不等于零,就一直循环

            temp=input1%input2;//求余结果

            input1=input2;//大的数已经没用了,用小的数替代

            input2=temp;//把求余的结果赋值给小的数

       }

       bigDivisor=input1;//最后一次求余结果为零时,被求余的数

       multiple=multiple/bigDivisor;

       System.out.println("最大公约数是:"+bigDivisor );

       System.out.println("最小公倍数是:"+multiple);    

       scanner.close();

    }

}

 

 

【程序3】

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

程序分析:???感觉不能下手! 

      * 这道题目使用的是构造方法,还有arrayList的知识!标准答案的答案!

      * 但是,还是被我用for循环给解决了

   * 这里重要的是使用赋值,还有充分使用给出的条件,还有一个就是互不冲突的常识,比如第一个if的使用!

public class Programme18 {

    public static void main(String[] args) {

       String a = null,b=null,c=null;//甲队成员

       String[] racer = {"x","y","z"};//乙队成员

       for(inti=0;i<3;i++){

           for (intj = 0; j <3;j++) {

              for (intk = 0; k < 3;k++) {

                     if (i!=j&&i!=k&&j!=k) {

                         a=racer[i];  b=racer[j];c=racer[k];

                         if (!a.equals("x")&&!c.equals("z")&&!c.equals("x")) {

                            if (a.equals(racer[i])&&b.equals(racer[j])&&c.equals(racer[k])) {

                                System.out.println("a的对手是:"+racer[i]+",b的对手是:"+racer[j] +",c的对手是:"+racer[k] );

                            }

                         }

                  }     

              }

           }

       }

    }

}

 

程序4】

题目:打印出杨辉三角形(要求打印出10行如下图)

程序分析:

      1

     1 1

    1 2 1

   1 3 3 1

  1 4 6 4 1

1 5 10 10 5 1

1、二维数组的使用

2、第一列的数都是1

3、使用两个for循环,i控制行,j控制列;

从第二行第二列起arr[i][j]=arr[i-1][j-1]+arr[i-1][j]

    public static void main(String[] args) {

        int[][]arr=newint[10][10];

        for (inti = 0; i < arr.length; i++) {

            arr[i][0]=1;//控制第一列的数等于1

       }

       for (inti = 1; i < arr.length; i++) {

           for (intj=1; j < arr.length; j++) {

              arr[i][j]=arr[i-1][j-1]+arr[i-1][j];//赋值

           }

       }

       //打印结果

       for (inti = 0; i < arr.length ; i++) {

           for (intk = arr.length-i;k>0;k--) {//空格的控制,为了好看

              System.out.print("  ");

           }

           for (intj = 0; j < arr.length; j++) {//打印出数组的数字

              if (arr[i][j]!=0) {//把把没赋值的零去掉

                  System.out.print(arr[i][j]+"   ");

              }

           }

           System.out.println();//控制换行

       }

    }

}

 

【程序5】

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

关键问题是怎么移除》?:布尔值确定,如果被选中被赋值为false

     * 从第一个人开始判断,如果他在圈内,那么报数,再判断他报的数是否是3,如果是的话移出圈外

     * 接着判断下一个人,是否到了最末,如果是的话,从零开始

     * 不断循环,直到最后剩下1个人

    public static void main(String[] args) {

       System.out.print("请输入一个整数:");

       Scanner scan = new Scanner(System.in);

       int n = scan.nextInt();

       scan.close();

       //定义数组变量标识某人是否还在圈内

       boolean[]isIn = newboolean[n];

       for(inti=0;i<isIn.length;i++){

             isIn[i] =true;

       }

       int inCount = n;//定义圈内人数

       int countNum = 0;//定义报数

       int index = 0;//定义索引

       while(inCount>1){//最后一人时退出循环

           if(isIn[index]){//判断下一个人是否在圈内

              countNum++;//在的话报数

              if(countNum==3){//如果这个数等于3

                  isIn[index] =false;//把他定义为出圈

                  countNum = 0;//报数清零,下一个好从1开始

                  inCount--;//圈内人数减一

              }

           }

           index++;//下一人的位置索引值

           if(index==n){//当索引到最后之后再从头开始

               index = 0;

           }

       }

       for(inti=0;i<n;i++){

           if(isIn[i]){//最后只有一个符合条件的

              System.out.println("留下的是:"+(i+1));

           }

       }

    }

}

 

【程序6】

题目:打印出如下图案(菱形)

   *

   ***

 ******

********

 ******

  ***

   *

程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,

               利用双重 for循环,第一层控制行,第二层控制列。

     详细分析第一部分图形的规律:1、这是一个等腰三角形,*的打印次数1、3、5、7等差数列

                                2、还要注意空格打印的 次数3、2、1、0逐渐递减

      * 第二部分同理可得!   

 public class Programme19 {

    public static void main(String[] args) {

       //打印上面部分:

       int n=4;

       for (inti = 0; i < n; i++) {  //控制行

           for (intk =3-i; k > 0 ; k--) { //控制*前面空格的输出

                  System.out.print(" ");

           }

           //输出符号,但不要换行

           for (intj = 0; j <=2*i;j++) {  //控制列

              System.out.print("*");

           }

           //输出完符号马上换行

           System.out.println();

       }

       //打印下面部分

       n=3;

       for (inti = n; i > 0; i--) {  //控制行

           for (intk =3-i+1; k > 0 ; k--) { //控制*前面空格的输出,第一行要加空格

                  System.out.print(" ");

           }

           //输出符号,但不要换行

           for (intj = 0; j <=2*i-2;j++) {  //控制列

              System.out.print("*");

           }

           //输出完符号马上换行

           System.out.println();

       }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值