acm试题

	最近参加了学校组织的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;
    }
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值