最近参加了学校组织的acm大赛,当然我没有把所有的题做出来,我们宿舍分别做出
了不同的题,我在此收集了一下,现在把题目和答案放给大家。
1.
任务描述
本关任务:编写程序,将一个键盘输入的正整数分解质因数
编程要求
测试输入:90;
预期输出:
90=2* 3* 3* 5
上面这个预期结果没有空格,是因为csdn这个编辑器没法显示原格式我手动加的
代码如下:
package com.educoder.competition;
import java.util.*;
public class Case1 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
/********** Begin *********/
System.out.print(n + "=");
for (int k = 2; k <= n; k++) {
while (n != k) {
if (n % k == 0) {
System.out.print(k + "*");
n = n / k;
} else {
break;
}
}
}
System.out.println(n);
/********** End *********/
}
}
2.
任务描述
在循环中,只要除数不等于 0 ,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为 0 ,返回较大的数,此数即为最大公约数,最小公倍数为两数之积除以最大公约数。
测试输入:6 9;
预期输出:
最大公约数: 3
最小公倍数: 18
代码如下:
package com.educoder.competition;
import java.util.*;
public class Case2 {
public static void main(String[] args) {
int a, b;
Scanner s = new Scanner(System.in);
a = s.nextInt();
b = s.nextInt();
/********** Begin *********/
System.out.println("最大公约数: "+gcd(a,b));
System.out.println("最小公倍数: "+lcm(a, b));
/********** End *********/
}
public static int gcd(int p, int q){
if(q == 0) {
return p;
}
while(p%q != 0){
int r = p % q;
p = q;
q = r;
}
return q;
}
public static int lcm(int p, int q) {
int p1 = p;
int q1 = q;
while (q != 0) {
int r = p % q;
p = q;
q = r;
}
return (p1 * q1) / p;
}
}
3.
任务描述
本关任务:已经两个输入参数,第一个参数为任意数字串,第二个参数为该字符串进制,要求把任意进制的数值将其转换为十进制数输出。
提示:使用Integer.valueOf(String,int)方法。
测试输入:25 6;
预期输出:17;
代码如下:
package com.educoder.competition;
import java.util.Scanner;
public class Case3 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
/********** Begin *********/
String str =String.valueOf(n);
int result=Integer.valueOf(str, m);
System.out.println(result);
/********** End *********/
}
}
4.
任务描述
本关任务:从输入参数接收一个 7 位以上的正整数,取这个正整数从右端开始的 4 ~ 7 位。当输入参数少于7位,则提示输入错误!。
测试输入:324564487;
预期输出:4564;
测试输入:3245;
预期输出:输入错误!;
代码如下:
package com.educoder.competition;
import java.util.*;
public class Case4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long l = scan.nextLong();
String str = Long.toString(l);
char[] ch = str.toCharArray();
int n = ch.length;
if (n < 7)
System.out.println("输入错误!");
else
System.out.println(""+ch[n - 7] + ch[n - 6] + ch[n - 5] + ch[n - 4]);
}
}
5.
任务描述
本关任务:从输入参数接收一串数字字符串,将串从数字不连续的位置断开,打印输出多个连续的串。
测试输入:12345234568923456789;
预期输出:
12345
23456
89
23456789
测试输入:658225468;
预期输出:
6
5
8
2
2
5
4
6
8
代码如下:
package com.educoder.competition;
import java.util.Scanner;
public class Case5 {
public static void main(String a[]) {
Scanner s = new Scanner(System.in);
String s1 = s.nextLine();
/********** Begin *********/
char[] ch = s1.toCharArray();
char a1=ch[0];
for(int i=1;i<ch.length;i++) {
if((a1+1)==ch[i]){
System.out.print(a1);
}else {
System.out.println(a1);
}
a1=ch[i];
}
if((ch[ch.length-2]+1)!=ch[ch.length-1]) {
System.out.println(ch[ch.length-1]);
}else {
System.out.print(ch[ch.length-1]);
System.out.println();
}
/********** End *********/
}
}
6.
任务描述
在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目要求编写程序对用户输入的串进行处理。处理具体规则如下:
把每个单词的首字母变为大写。
把数字与字母之间用下划线字符(_)分开,使得更清晰
把单词中间有多个空格的调整为1个空格
假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号,每个单词间由1个或多个空格分隔。
测试输入:you and me what cpp2005program;
预期输出:You And Me What Cpp_2005_program;
代码如下:
版本一:
这个版测试结果都符合预期,但无法提交。
package demo;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Case6 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
String s=cin.nextLine();
String []a=new String [100];
int t=0;
StringTokenizer st = new StringTokenizer(s," ");
while(st.hasMoreElements()) {
a[t]=(String) st.nextElement();
t++;
}
for (int i=0;i<t;i++) {
a[i]=a[i].substring(0,1).toUpperCase().concat(a[i].substring(1));
for(int j=0;j<a[i].length()-1;j++){
char b=a[i].charAt(j);
char c=a[i].charAt(j+1);
if((Character.isDigit(b)&&Character.isLetter(c))||(Character.isDigit(c)&&Character.isLetter(b))){
a[i]=a[i].substring(0,j+1)+"_"+a[i].substring(j+1);
}
}
System.out.print(a[i]+" ");
}
cin.close();
}
}
版本二:
这个可以正常提交。
package com.educoder.competition;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Case6 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
/********** Begin *********/
String ss=s.trim();
char [] ch=ss.toCharArray();
if(ch[0]!=' ')
System.out.print(Character.toUpperCase(ch[0]));
for(int i=1;i<ch.length;i++){
if(ch[i]==' '){
continue;
}else if(ch[i-1]==' '){
if(ch[i]!=' '){
System.out.print(' ');
}
System.out.print(Character.toUpperCase(ch[i]));
}
else{
System.out.print(ch[i]);
if((i+1<ch.length)&&(ch[i+1]+0)>=48&&(ch[i+1]+0)<=57){
if(ch[i]>57)
System.out.print('_');
}
if((i+1<ch.length)&&(ch[i]+0)>=48&&(ch[i]+0)<=57&&(ch[i+1]+0)>57){
System.out.print('_');
}
}
}
System.out.println();
/********** End *********/
}
}
7.
任务描述
今天是 2018 年 12 月 2 日,星期日。这天小明和爸爸 妈妈去公园玩了一天。他想:这个月什么时候才能再和爸爸妈妈一起出来玩呢?
小明的爸爸妈妈工作很忙,只有在休息的时候才能陪他一起玩。爸爸每工作 4 天休息一天,妈妈每工作 3 天休息一天;小明每上学 5 天休息 2 天.
你那个帮他算出来吗?
该题以 yyyy-MM-dd 格式输入一个当前一起玩的日期;
输出下次玩的日期,格式: yyyy-MM-dd 。
测试输入:2018-12-02;
预期输出:2018-12-22;
代码如下:
package com.educoder.competition;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class Case7 {
public static void main(String[] f) throws ParseException {
Scanner sc = new Scanner(System.in);
String aString = sc.nextLine();
/********** Begin *********/
String[] sp1= aString.split("-");
Calendar c1=Calendar.getInstance();
c1.set(Calendar.YEAR, Integer.parseInt(sp1[0]));
c1.set( Calendar.MONTH, Integer.parseInt(sp1[1])-1);
c1.set(Calendar.DATE, Integer.parseInt(sp1[2]));
c1.add(Calendar.DATE, 20);
int m=(c1.get(Calendar.MONTH)+1);
int d=c1.get(Calendar.DATE);
String MONTH1=m<10?"0"+m:m+"";
String DATE1=d<10?"0"+d:d+"";
System.out.println(c1.get(Calendar.YEAR)+"-"+MONTH1+"-"+DATE1);
/********** End *********/
}
}
8.
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服, 问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子, 在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8粒麦子,……后一格的数字是前一格的两倍, 直到放完所有棋盘格(国际象棋共有64格)。 国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用! 请你借助计算机准确地计算,到底需要多少粒麦子。
预期结果:
18446744073709551614
代码如下:
package com.educoder.competition;
import java.math.BigInteger;
public class Case8 {
public static void main(String[] args) {
/********** Begin *********/
BigInteger sum =new BigInteger("0");
BigInteger js =new BigInteger("2");
for(int i=0;i<64;i++) {
sum=sum.add(js.pow(i));
}
System.out.println(sum);
/********** End *********/
}
}
9.
任务描述
有 N 个人参加 100 米短跑比赛,跑道为 8 条。程序的任务是按照尽量使每组的人数相差最少,分组组数也最少的原则分组。
例如:
N=8 时,分成 1 组:一组 8 人。
N=9 时,分成 2 组:一组 5 人,一组 4 人。
N=25 时,分 4 组:7、6、6、6。
请编程计算分组数字。要求从键盘输入一个正整数(1~100之间,不必考虑输入错误的情况),表示参赛的运动员数。程序输出每个分组的人数。从大到小顺序输出,每个数字一行。
测试输入:25;
预期输出:7 6 6 6;
代码如下:
package com.educoder.competition;
import java.util.Scanner;
public class Case9 {
public static void main(String[] args) {
//运动员人数
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
/********** Begin *********/
if (n % 8 == 0) {
int count=n/8;
for (int i = 0; i < count; i++) {
System.out.println("8");
}
} else {
int zs = n / 8 + 1;
int ren = n / zs;
int ren1 = n - ren*zs;
for (int j = 0; j < zs; j++, ren1--) {
if (ren1 > 0) {
System.out.print(ren + 1 );
} else {
System.out.print(ren );
}
System.out.println();
}
}
/********** End *********/
}
}
10.
任务描述
方阵的主对角线之上称为“上三角”。请设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
输入参数为整数 n(3~10)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为 4 ,右对齐
测试输入:3;
预期输出:
1 2 3
6 4
5
测试输入:4;
预期输出:
1 2 3 4
9 10 5
8 6
7
代码如下:
package com.educoder.competition;
import java.util.Scanner;
public class Case10 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
/********** Begin *********/
show(f(n));
/********** End *********/
}
static void show(int[][]x){
for(int i=0;i<x.length;i++){
for(int j=0;j<x[i].length;j++){
if(x[i][j]!=0)
System.out.print(String.format("%4d",x[i][j]));
}
System.out.println();
}
}
static int[][] f(int m){
//开一个二维数组
int[][] a=new int[m][m];
int w=1;
int r=0;
int c=0;
L1: while(true){
//向下
for(;;){
//最大的w不能超过二维数组长度减去含0的数字
if(w>m*m-g(m)) break L1;
a[r][c++] = w++;
if(c==m|| a[r][c]>0) break;
}
c--;
c--;
r++;
//向左下
for(;;){
if(w>m*m-g(m)) break L1;
a[r++][c--]=w++;
if(r==m||c<0||a[r][c]>0) break;
}
c++;
r--;
r--;
//向上
for(;;){
if(w>m*m-g(m)) break L1;
a[r--][c]=w++;
if(r<0||a[r][c]>0) break;
}
r++;
c++;
}
return a;
}
//数组里为0的个数
static int g(int m){
int count = 0;
for(int i=0;i<m-1;i++){
for(int j=0;j<=i;j++){
count++;
}
}
return count;
}
}