2023民大大一电信Java实验一

目录

一、求闰年

二、孪生素数问题

 三、完全数问题 Perfect Number

四、 求两组整数的异或集和交集

五、回文数 

附录(Java上机实验课要求):


一、求闰年

编写程序显示x~y年中所有的闰年,x, y从键盘输入。

【问题描述】输入两个年份,输出两个年份之间的所有闰年。
提示:能被4整除却不能被100整除 或 能被400整除的年份是闰年

【输入形式】两个年份,用空格分隔
【输出形式】两个年份之间的所有闰年,每个闰年用空格隔开

表1.1 实验题目1的测试用例

序号

样例输入

样例输出

1

2011 2021

2012 2016 2020

//求闰年
import java.util.Scanner;

class Main{
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int a,b;
        a = sc.nextInt();
        b = sc.nextInt();

        for (int i = a; i <= b; i++) {
            if (i%4==0&&i%100!=0||i%400==0){
                System.out.print(i+" ");
            }
        }
    }
}

运行结果: 

2011 2021
2012 2016 2020 
进程已结束,退出代码0

二、孪生素数问题

【问题描述】

素数(质数)指的是不能被分解的数,除了1和它本身之外没有其他数能够整除。如果两个素数之差为2,则这两个素数就是孪生素数,例如35为孪生素数,57为孪生素数。从键盘输入一个小于100的正整数n,找出n-100之间的所有孪生素数。

【输入形式】一个正整数nn<100
【输出形式】输出互为孪生素数的两个数,每对1行,用空格隔开。

表1.2实验题目2测试用例

序号

样例输入

样例输出

1

20

29 31

41 43

59 61

71 73

【样例说明】

第1行表示29和31为孪生素数

第2行表示41和43为孪生素数

//孪生素数
import java.util.ArrayList;
import java.util.Scanner;

class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> arr = new ArrayList<Integer>();

        int n = sc.nextInt();

        for (int i = n; i < 100 ; i++) {
            if (ifprime(i)){
                arr.add(i);
            }
        }

        for (int i = 0; i < arr.size()-1; i++) {
            if (arr.get(i+1)-arr.get(i)==2){
                System.out.print(arr.get(i)+" ");
                System.out.println(arr.get(i+1));
            }
        }

    }
    static boolean ifprime(int a){

        for (int i = 2; i <= Math.sqrt(a); i++) {
            if (a%i==0){
                return false;
            }
        }
        return true;
    }
}

运行结果: 

20
29 31
41 43
59 61
71 73

进程已结束,退出代码0

文章引用: 

(1条消息) int与Integer区别及应用场景_int和interger的区别_朝雨伊轻尘的博客-CSDN博客

 三、完全数问题 Perfect Number

【问题描述】

完全数,又称为完美数或完备数,是一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。例如,第一个完全数是6,它的约数1236,去除它本身6外,其余3个数相加,1+2+3=6.第二个完全数是28,它有约数12471428,除去它本身28外,其余5个数相加,1+2+4+7+14=28。从键盘输入一个正整数n,编程求1~n以内的完全数。

【输入形式】一个正整数n(不超过10000

【输出形式】

输出1~n以内的完全数,并输出每个完数的真因子。完数及各真因子之间用空格隔开,一个完数一行

表1.3 实验题目3测试用例

序号

样例输入

样例输出

1

100

6 1 2 3

28 1 2 4 7 14

【样例说明】

一个完数及其真因子占一行,第一行输出表示6为完数,1 2 3是它的真因子

//perfect number
import java.util.Scanner;

class Main{

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        for (int i = 1; i <= n ; i++) {
            if (ifperfect(i)){
                System.out.print(i+" ");
                priDivisor(i);
            }
        }
    }
    public static boolean ifperfect(int i) {
        int sum = 0;
        for (int j = 1; j < i; j++) {
            if (i % j == 0){
                sum += j;
            }
        }
        return sum == i;
    }

    public static void priDivisor(int i) {
        for (int j = 1; j < i; j++) {
            if (i % j == 0){
                System.out.print(j + " ");
            }
        }
        System.out.println();
    }
}

运行结果:

100
6 1 2 3 
28 1 2 4 7 14 

进程已结束,退出代码0

四、 求两组整数的异或集和交集

【问题描述】

从标准输入中输入两组整数(每行不超过20个整数,每组整数中元素不重复),求两组整数的异或集(合并两组整数,去掉在两组整数中都出现的整数后形成的集合)和交集(在两组整数中都出现的整数形成的集合),并按从大到小顺序排序输出。

【输入形式】

首先输入第一组整数,以一个空格分隔各个整数;然后在新的一行上输入第二组整数,以一个空格分隔。两行最后一个整数后没有空格,只有回车换行

【输出形式】

先按从大到小顺序排序输出两组整数的异或集(以一个空格分隔各个整数,最后一个整数后也有一个空格),然后在下一行按照从大到小的顺序排序输出两组整数的交集(以一个空格分隔各个整数,最后一个整数后也有一个空格)。若两组整数的异或集或交集为空,则相应的输出行上只输出一回车换行。

表1.4 实验题目4测试用例

序号

样例输入

样例输出

1

5 1 4 32 8 7 9 -6

5 2 87 10 1 6

87 32 10 9 8 7 6 4 2 -6 

5 1

【样例说明】

第一组整数为51432879-6,第二组整数分别为52871016。将第一组和第二组整数合并,并去掉在两组整数中都出现的整数51即可得到两组整数的异或集,并从大到小顺序排序后结果为87 32 10 9 8 7 6 4 2 -6 ;两组整数中都出现的整数51形成了交集,按从大到小的顺序输出为:5 1

//交集 异或集
import java.util.*;

class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//输入两行数据
        String t = sc.nextLine();
        String[] arr1 = t.split(" ");
        //System.out.println(Arrays.toString(arr1));
        //第二行
        t = sc.nextLine();
        String[] arr2 = t.split(" ");
        ArrayList<String> t_arr1 = new ArrayList<>();//交集
//找交集
        for (String temp0 :
                arr1) {
            for (String temp1 :
                    arr2) {
                if (temp0.equals(temp1)){
                    t_arr1.add(temp0);
                    break;
                }
            }
        }
//找异或集
        ArrayList<String> t_arr2 = new ArrayList<>();//异或集
        t_arr2.addAll(Arrays.asList(arr1));
        t_arr2.addAll(Arrays.asList(arr2));
        //System.out.println("并集:");
        //System.out.println(Arrays.toString(t_arr2.toArray()));

        for (String temp :
                t_arr1) {
            t_arr2.remove(temp);
            t_arr2.remove(temp);
            }
//转整数来排序 字符串不好排
//异或集降序输出
        toint_out(t_arr2);
//交集输出
        toint_out(t_arr1);
    }

    //转成整数再输出的方法
    private static void toint_out(ArrayList<String> t_arr) {
        //转成整数
        Integer[] t_arr1 = new Integer [t_arr.size()];//
        for (int i = 0; i < t_arr.size(); i++) {
            t_arr1[i] = Integer.parseInt(t_arr.get(i));
        }
        //降序
        Arrays.sort(t_arr1,Collections.reverseOrder());
        //输出
        for (int value :
                t_arr1) {
            System.out.print(value+" ");
        }
        System.out.println();
    }
}

代码运行: 

5 1 4 32 8 7 9 -6
5 2 87 10 1 6

87 32 10 9 8 7 6 4 2 -6 
5 1 

进程已结束,退出代码0

 涉及文章:

(1条消息) String类的split方法,字符串分割成数组_string分割成数组_Bworry的博客-CSDN博客

(1条消息) JAVA中判断两个字符串是否相等_komorebi-JCE的博客-CSDN博客

在Java中对字符串数组进行排序 (techiedelight.com)

Java 数组排序——如何使用 Arrays.sort() 升序或降序排列数组 (freecodecamp.org)

(1条消息) Java中Array、List、ArrayList的区别_list和array list区别_wiidi的博客-CSDN博客

Java ArrayList addAll() 方法 | 菜鸟教程 (runoob.com)

(2条消息) Java中String类型数组转换为int类型数组_javastring数组转int数组_初Q,的博客-CSDN博客

鸣谢: 

感谢舒振宇老师。我当时求异或集是用定义。在他启发之后,现在是数学方法求异或集:并集 - 交集 = 异或集(要除去并集中含有交集的所有元素),方便很多。

五、回文数 

【问题描述】

键盘输入一个1-99999之间的整数,编程判断这个数字是几位数,并且判断该数是否是回文数。回文数指的是该数逆序排列后得到的数和原数相同。例如12321、3223 都是回文数,12312不是回文数。

【输入形式】输入任意一个1-99999之间的整数

表1.5实验题目5测试用例

序号

样例输入

样例输出

1

12421

please input 1-99999 number
12421 is 5 bit

12421 is a palindrome number

//回文数
import java.util.ArrayList;
import java.util.Scanner;

class Main{
    public static void main(String[] args) {
        System.out.println("please input 1-99999 integer number");
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int n0 =n;
        ArrayList<Integer> arr = new ArrayList<>();

        while (n!=0){
            arr.add(n%10);
            n/=10;
        }
        //System.out.println(Arrays.toString(arr.toArray()));
        System.out.println(n0+" is "+arr.size()+" bit");

        int i;
        for ( i = 0; i <= arr.size() / 2; i++) {
            if (arr.get(i) != arr.get(arr.size()-1-i)){
                break;
            }
        }
        if (i == arr.size()/2 +1){
            System.out.println(n0+" is a palindrome number");
        }
        else {
            System.out.println(n0+" is not a palindrome number");
        }
    }
}

代码运行: 

please input 1-99999 integer number
12421
12421 is 5 bit
12421 is a palindrome number

进程已结束,退出代码0


附录(Java上机实验课要求):

Java语言实验将于下周开始,请同学们注意:

1. 严格按课表时间进行实验;

2. 按要求撰写实验预习报告:

  预习报告内容包括:

  (1) 题号(实验题目提前在学习通中发布);

  (2) 程序(不要求事先必须运行通过,上机时调试、提交,程序代码请务必亲自敲);

  (3) 程序需要测试的数据及对应的预期结果(非老师给的测试数据,自行准备至少一组),该项在该次预习成绩中占5分

  (4) 注意程序的代码风格,该项在该次预习成绩中占5分;

    预习报告一般不允许提交电子档或打印稿。如想申请提交电子档:1)上学期C语言成绩90;(2)需事先向任课老师申请,考核通过后方可

    实验指导老师上机时检查预习报告的完成情况,并进行评分,该分将计入上机实验成绩,并纳入课程总评成绩。

3. 上机时先在IDE(集成开发环境)下运行程序,运行结果正确后才能在希冀大数据实验平台(CGOJ   http://192.168.122.231 )中提交。

  预习报告本不限,自行选择练习本。

尾声:

文章仅供学习交流,若有更好的解法欢迎分享。

 若有不足,敬请斧正。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qiming_Peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值