第一届“传智杯”全国大学生IT技能大赛真题

题目1

从古至今,各种末日谣言层出不穷。假如现在有这样一个谣言:天文学家在2014年6月1日,发现一颗行星,根据该行星的运行轨道,在3000天以后,该行星将撞击地球。现在,请编写Java程序计算,该谣言指向的“世界末日”是哪一天?
要求输出格式为:xxxx-xx-xx(例如:2015-12-12),不要添加任何其他多余文字。

输入描述:无
输出描述:
计算的结果日期,格式为:xxxx-xx-xx

输入样例:无
输出样例:
2015-12-12

import java.util.Calendar;
import java.util.Date;

public class Answer1 {
	public static void main(String[] args) {
		int year=2014;//date的输出为1900年到现在的年数,因此需要具体年份时需要+1900
		int month=6;//需要注意,在调用calendar或date类的方法时,输入或输出的月份均为0-11
		int day=1;
		int add=3000;
		
		//1.调用calendar的add方法
		Calendar calendar = Calendar.getInstance();
		calendar.set(year, month-1, day);
		calendar.add(Calendar.DATE, add);
		System.out.println(calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH)+1)
				+"-"+calendar.get(Calendar.DATE));
		
		//2.直接用calendar设置增加后的日,进行输出
		Calendar calendar1 = Calendar.getInstance();
		calendar1.set(year, month-1, day+add);
		System.out.println(calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH)+1)
				+"-"+calendar.get(Calendar.DATE));
		
		//3.直接用calendar设置增加后的日,再调用date格式化
		Date date = new Date(year, month-1, day+add);
		System.out.println(date.getYear()+"-"+(date.getMonth()+1)+"-"+date.getDate());
	}
}

题目2

由1到n的平方个数字组成的n×n阶方阵(n为任意给定的一个不小于3的奇数),它的每行、每列及对角线上的数字和都相等,称为n阶魔方阵。它的每行、每列及对角线上的数字和为n×(n² + 1) / 2。该方阵的排列方法是:

(1) 将数字1放在第一行的中间位置上,即(0,n/2)位置;
(2) 下一个数放在当前位置(i, j)的上一行(i-1)、下一列(j+1),即当前位置的右上方;如果出现以下情况,则修改填充位置:
① 若当前位置是第一行,下一个数放到最后一行,即把i-1修改为n-1;
② 若当前位置是最后一列,下一个数放在第一列,即把j-1修改为n-1;
③ 若下一个数要放的位置已经有数字,则下一个数放在当前位置的下一行,相同列。
(3) 重复以上过程,直到n²个数字不重复的填入方阵中。
根据以上描述,请使用Java语言,设计一个程序,输出n阶魔方阵。
魔方阵.jpg
输入描述:
一个大于等于3的奇数n,不建议太大,3-9即可
输出描述:
一个n*n的数字矩阵,每行的数字之间采用一个制表符"\t"分隔
输入样例:
3
输出样例:
8 1 6
3 5 7
4 9 2

import java.util.Scanner;

public class Answer2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		int num[][]=new int[n][n];
		int i=0;
		int j=n/2;
		int k=1;
		while(k<=n*n){
			if (num[i][j]==0) {
				num[i][j]=k++;
				i=(i-1+n)%n;
				j=(j+1+n)%n;
			}else {
				i=(i+1+n)%n;
			}
		}
		for (i = 0; i < n; i++) {
			for(j=0;j<n;j++){
				System.out.print(num[i][j]+"\t");
			}
			System.out.println();
		}
	}
}

题目3

从前,某国王在处决500名死囚犯时突发奇想,想赦免其中的一个人,于是他把这500个死囚犯从1到500编号,都放到一片空地上,让大家手牵手组成一个大环。从1号开始报数,凡是报数为3的倍数的人就要被杀掉,每轮过后,剩下的人组成一个较小的环,继续报数(注意,上一轮最后一人报数后,下一轮的第一个人要继续往下报,而不是重新从1开始),直到剩下最后一个人为止。请编写程序计算,最终这个幸运的人是几号?

输入描述:无
输出描述:
一个整数,表示最终活下来的人员编号

输入样例:无
输出样例:
55

import java.util.ArrayList;

public class Answer3 {
	public static void main(String[] args) {
		int n=500;
		ArrayList<Integer> ai=new ArrayList<>();
		for (int i = 0; i < n; i++) {
			ai.add(i+1);
		}
		ArrayList<Integer> temp=new ArrayList<>();
		int i=0;
		int num=1;
		while(ai.size()>1){
			if(num%3!=0)temp.add(ai.get(i));
			if (i==ai.size()-1) {
				ai=new ArrayList<>();
				ai=temp;
				i=0;
				temp=new ArrayList<>();
				continue;
			}
			i++;
			num++;
		}
		System.out.println(ai.get(0));
	}
}

题目4

给定一个正整数m(m最小是一个两位数),现在想从组成m这个数的数字中,去掉其中的n个数字(0 < n < m的位数),但保持每位上的数字相对顺序不变,使得剩余的数字组成的数是最大值。例如:
当m = 51342,n = 1;则结果应该是去掉数字1,剩余的值最大,为5342;
当m = 51342,n = 2;则结果应该是去掉数字1、3,剩余的值最大,为542;
当m = 51342,n = 3;则结果应该是去掉数字1、3、2,剩余的值最大,为54;

请使用Java语言编程,实现该算法。其中的m和n按要求输入正确范围内的数字即可,无需做合法校验。

输入描述:
第一行输入正整数m(m >= 10)
第二行输入去掉的数字个数n(0 < n < m的位数)
输出描述:
去掉n个数字后的最大值

输入样例:
51342
2
输出样例:
542

import java.util.Scanner;

public class Answer4 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int m=sc.nextInt();
		int n=sc.nextInt();
		while(n-->0)m=getSubMax(m);
		System.out.println(m);
	}
	/**
	 * 返回参数m去掉一位数字后的最大值
	 * @param m
	 * @return
	 */
	public static int getSubMax(int m){
		String str=m+"";
		int len=(str).length();
		if(len==1){
			return m;
		}
		int max=Integer.parseInt(str.substring(1));
		int temp=0;
		for (int i = 1; i < len-1; i++) {
			temp=Integer.parseInt(str.substring(0, i)+str.substring(i+1));
			if (temp>max) max=temp;
		}
		temp=Integer.parseInt(str.substring(0,len-1));
		if (temp>max) max=temp;
		return max;
	}
}

题目5

小智拿到一个数列{a1, a2, …, an},现在他想从这个数列中取出若干数,组成一个新的数列{ai1, ai2, …, aim},其中索引i1, i2, …, im保持递增,也就是说数列中各个数仍然保持在原数列中的先后顺序。并且在新数列中,对于任意索引ix > iy,都有aix > aiy,也就是说新数列是一个递增的子序列。

请编写程序,求出符合上述要求的最长递增子序列的长度。

例如数列[1, 3, 6, 7, 9, 4, 10, 5, 6],最长递增子序列为[1, 3, 6, 7, 9, 10],长度是6。

输入描述:

任意个数的整数,中间使用空格分隔
输出描述:

一个整数,表示符合题目要求的最长子序列的长度
输入样例:

1 3 6 7 9 4 10 5 6
输出样例:

6

import java.util.Scanner;

public class Answer5 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		String[] str = input.split(" ");
		int[] num=new int[str.length];
		int[] count=new int[str.length];
		for (int i = 0; i < num.length; i++) {
			num[i]=Integer.parseInt(str[i]);
			count[i]=getCount(num, count, i)+1;
		}
		int maxLen=count[0];
		for (int i = 1; i < num.length; i++) {
			if(maxLen<count[i])maxLen=count[i];
		}
		System.out.println(maxLen);
	}
	public static int getCount(int[] num,int[] count,int k){
		int N=0;
		for (int i=k-1;i>=0;i--) {
			if(num[i]<num[k]&&N<count[i])N=count[i];
		}
		return N;
	}
}

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
传智书城源码是一个基于JavaWeb技术开发的在线图书销售系统。它是传智播客开发的一个实例项目,旨在演示并实践JavaWeb的相关知识。该源码包含了前后端的代码和数据库设计,并提供了完整的功能。 首先,传智书城源码搭建了一个用户友好的网站界面,用户可以浏览和搜索图书,查看图书的详细信息,包括作者、出版日期、价格等。同时,用户可以将心仪的图书加入购物车,方便后续购买。此外,源码还实现了用户注册和登录功能,用户可以创建自己的账号,随时登录以便管理个人信息和订单。 其次,传智书城源码实现了网上购物的核心功能,包括购物车管理和订单管理。用户可以查看和修改购物车的内容,包括增加和删除图书,同时还可以修改购买数量。用户下单后,源码会生成订单,并提供订单管理功能,例如查看订单详情、取消订单等。传智书城源码还提供了支付功能,用户可以通过网上支付方式完成订单支付。 除了用户功能之外,传智书城源码还包含了管理后台的功能。管理员可以登录管理后台,对图书信息和订单进行管理和操作。管理员可以添加、删除和修改图书信息,包括图书分类、库存、价格等。同时,管理员还可以查看和处理用户的订单,例如发货和退款等操作。 总的来说,传智书城源码是一个完整的、具有一定规模的JavaWeb项目,涵盖了用户前台和管理员后台的功能需求,实现了图书销售的各种操作,为学习和实践JavaWeb开发提供了良好的参考和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值