【Java基础】【练习题3】while循环、for循环、函数的递归调用

1. while 循环

// 1. 从键盘输入一个整数,判断这个数是不是素数
// 提示,素数的定义:质数又称素数。指在一个大于1的自然数中,
// 除了1和此整数自身外,没法被其他自然数整除的数。(用while或for皆可)
// 此操作用到取模%运算符。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
//        1.	从键盘输入一个整数,判断这个数是不是素数
//        提示,素数的定义:质数又称素数。指在一个大于1的自然数中,
//        除了1和此整数自身外,没法被其他自然数整除的数。(用while或for皆可)
//        此操作用到取模%运算符。
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数,让我来判断他是不是素数:");
        int n = sc.nextInt();
        int i=2;
        boolean flag = true;
        while(i<n/2){
            if(n%i==0){
                flag = false;
                break;
            }
            i++;
        }
        if (flag){
            System.out.println("是素数");
        }
        else{
            System.out.println("不是素数");
        }
    }
}

// 2. 学生参考下述程序,程序为产生一个1-6之间的随机数。(模仿摇色子)
//public static void main(String[] args) {
// // TODO Auto-generated method stub
// //Math.random()函数返回0.0(含)-1.0(不含)之间的小数
// //乘以6之后,转换为正数,范围为0-5,加1,范围变为1-6
// int a = (int)(Math.random() * 6) + 1;
// System.out.println("a = " + a);
// }
//题目要求:
//要求学生根据参考程序,做出模拟扑克牌发牌程序,具体要求如下:
//1) 用1-13表示扑克牌中的A、2-10、J、Q、K共13张牌。
//2) 用while循环发牌,发5张牌,然后将发到的牌显示出来。不用按大小排序。
//3) 输出结果参考:“您本次发到的牌为10、J、Q、K、A”
//4) 不用校验是否5张牌一样。(扑克中每种牌只有4张)
//5) 发完牌后,可以结合switch来实现1、11、12、13这几张牌到字母的转换。(用不用都可以,只要能正确输出结果)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
//       2.	学生参考下述程序,程序为产生一个1-6之间的随机数。(模仿摇色子)
//public static void main(String[] args) {
//		// TODO Auto-generated method stub
//		//Math.random()函数返回0.0(含)-1.0(不含)之间的小数
//		//乘以6之后,转换为正数,范围为0-5,加1,范围变为1-6
//		int a = (int)(Math.random() * 6) + 1;
//		System.out.println("a = " + a);
//	}
//题目要求:
//要求学生根据参考程序,做出模拟扑克牌发牌程序,具体要求如下:
//1)	用1-13表示扑克牌中的A、2-10、J、Q、K共13张牌。
//2)	用while循环发牌,发5张牌,然后将发到的牌显示出来。不用按大小排序。
//3)	输出结果参考:“您本次发到的牌为10、J、Q、K、A”
//4)	不用校验是否5张牌一样。(扑克中每种牌只有4张)
//5)	发完牌后,可以结合switch来实现1、11、12、13这几张牌到字母的转换。(用不用都可以,只要能正确输出结果)
        int i=0;
        int[] a = new int[5];
        String[] s = new String[5];
        System.out.print("您本次发到的牌是:");
        while (i<a.length){
            a[i] = (int)(Math.random() * 13) + 1;
            switch(a[i]){
                case 1:s[i]="A";break;
                case 11:s[i] = "J";break;
                case 12:s[i] = "Q";break;
                case 13:s[i]="K";break;
                default:s[i] = String.valueOf(a[i]);

            }
            System.out.print(s[i]+" ");
            i++;
        }

    }
}

2.for循环

// 1. 将上题,发扑克牌程序,改写为支持以下要求(用for语句):
// 1) 给6个人发牌,每人发5张牌。
// 2) 如果某人第5张牌与前4张相同,则重发这一张牌(结合continue)
// 3) 输出6个人的牌面,如:“玩家1的牌面为:A、10、10、9、9”。不用按大小排序。等等。

// 给六个人发牌循环6次;

public class Main{
    public static void main(String[] args){
//        1.	将上题,发扑克牌程序,改写为支持以下要求(用for语句):
//        1)	给6个人发牌,每人发5张牌。
//        2)	如果某人第5张牌与前4张相同,则重发这一张牌(结合continue)
//        3)	输出6个人的牌面,如:“玩家1的牌面为:A、10、10、9、9”。不用按大小排序。等等。

//        给六个人发牌循环6次;

        for (int i = 0;i<6;i++){
//            给每个人发5张,牌面大小1-13
            int[] a = new int[5];
            String[] s = new String[5];
            System.out.print("第"+(i+1)+"个人拿到的牌是:");
            for (int j=0;j<5;j++){
                a[j] = (int)(Math.random()*13)+1;
                switch(a[j]){
                    case 1:s[j]="A";break;
                    case 11:s[j] = "J";break;
                    case 12:s[j] = "Q";break;
                    case 13:s[j]="K";break;
                    default:s[j] = String.valueOf(a[j]);
                }
                System.out.print(s[j]+" ");
            }
            System.out.println();
        }

    }
}

// 2. 使用for语句(嵌套),打印出以下图形:
// *
// ***
// *****
// *******
// ********//9个星号
// *******
// *****
// ***
// *
//提示:①可以分两次打印出上半部和下半部两个三角形
号。
//②如果有兴趣,可以试验一下一次性输出上述图形,
// 提示一种思路:可以在for( 1; 2; 3)的第3部分,用问号运算符写一个判断,看是增加还是减少。
//③注意,考虑控制循环的次数和星号、空格的个数的关系。

public class Main{
    public static void main(String[] args){
//     2.	使用for语句(嵌套),打印出以下图形:
//         *
//        ***
//       *****
//      *******
//     *********//9个星号
//      *******
//       *****
//        ***
//         *
//提示:①可以分两次打印出上半部和下半部两个三角形*号。
//②如果有兴趣,可以试验一下一次性输出上述图形,
// 提示一种思路:可以在for( 1; 2; 3)的第3部分,用问号运算符写一个判断,看是增加还是减少。
//③注意,考虑控制循环的次数和星号、空格的个数的关系。

        for(int i = 0;i<5;i++){
            for(int j=0;j<5-i;j++){
                System.out.print(" ");
            }
            for(int j=0;j<2*i-1;j++){
                System.out.print("*");
            }
            System.out.println();
        }
        for(int i=5;i>0;i--){
            for (int j=0;j<5-i;j++){
                System.out.print(" ");
            }
            for(int j=0;j<i*2-1;j++){
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

3.函数递归调用

// 1. 函数的编写和调用
// 1) 自己编写一个整数的求N次方的函数。
// 要求从控制台输入2个整数,第一个整数为底数,第二个整数为次方数,函数返回该整数的N次方幂。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
//    1.	函数的编写和调用
//    1)	自己编写一个整数的求N次方的函数。
//    要求从控制台输入2个整数,第一个整数为底数,第二个整数为次方数,函数返回该整数的N次方幂。
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入底数");
        int a = sc.nextInt();
        System.out.println("请输入次方");
        int b = sc.nextInt();
        System.out.println(sum(a,b));

    }
    static int sum(int a, int b){
        int sqr = 1;
        for(int i=0;i<b;i++){
            sqr*=a;
        }
        return(sqr);
    }
}

// 3. 函数的递归调用
//1) 有一分数序列1/1 + 1/2 + 1/3 + 1/4 + 1/5……,求出这个序列前100项之和。
//注意:①整型值和浮点型的精度问题。思考把一个浮点型值赋值给整形会怎么样。
//②怎样控制递归调用的次数,在100次时完成返回。
//2) 有一分数序列 2/1,3/2,5/3,8/5,13/8… 求出这个序列前20项之和。
//3) 结合递归调用第1题(1/1 + 1/2 + 1/3 + 1/4 + 1/5……),和课堂练习的阶乘递归函数,用递归函数编写1/1! + 1/2! + 1/3! + 1/4! + 1/5!……的头10项之和。
//提示:分母的值为一次调用阶乘函数。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
//   3.	函数的递归调用
//1)	有一分数序列1/1 + 1/2 + 1/3 + 1/4 + 1/5……,求出这个序列前100项之和。
//注意:①整型值和浮点型的精度问题。思考把一个浮点型值赋值给整形会怎么样。
//②怎样控制递归调用的次数,在100次时完成返回。
//2)	有一分数序列 2/1,3/2,5/3,8/5,13/8… 求出这个序列前20项之和。
//3)	结合递归调用第1题(1/1 + 1/2 + 1/3 + 1/4 + 1/5……),和课堂练习的阶乘递归函数,用递归函数编写1/1! + 1/2! + 1/3! + 1/4! + 1/5!……的头10项之和。
//提示:分母的值为一次调用阶乘函数。

    System.out.println(sum(100));
    System.out.println(sum20(20));
    System.out.println(sum1(20));
}

//求和1/1+1/2+1/3+...前100项
    static double sum(int b){
        double summ=0;
        double a ;
        for(int i=1;i<=b;i++){
                a = (double)1/i;
            summ +=a;
        }
        return summ;

}

//2/1,3/2,5/3,8/5,13/8… 求和
    static  double sum20(int b){
        double sum20=2 ;
        int a1 =2;
        if (b==1){
            return 2;
        }
        else {

            for (int i = 1; i <b; i++) {

                sum20 += ((double) a1 + i) / (double) (a1);
                a1 = a1 + i;
            }
            return sum20;
        }
}

//求和阶乘分之一
    static double sum1(int b){
        double sum1 =0;
        for(int i=1;i<b;i++){
            sum1+=(double)1/jiecheng(i);
        }
        return sum1;
    }
//分母阶乘的计算
    static int jiecheng(int i){
        int num = 1;
        for (int j=i;j>0;j--){
            num*=j;
        }
        return num;
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值