全国高校计算机能力挑战赛模拟题

全国高校计算机能力挑战赛模拟题

1.统计1到N(含)之间所有平方数的个数,并输出这个数目。
提示:平方数的个数,如4是2的平方数,16是4的平方数,5不是平方数。
输入说明:一个整数N(N<100000);
输出说明:平方数的个数
输入样例:50
输出样例:7

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        sc.close();
        int count = 0;
        for (int i = 1; i <= m ; i++) {
            if(Math.sqrt(i) % 1 == 0){
                count++;
            }
        }
        System.out.println(count);
    }
}

2.对于给出的长度为N(N<1000)的正整数数组,满足连续3个元素均为合数的区间称为3合数区间,计算该数组中3合数区间的个数。
输入说明:第一行,数组中元素个数N,第二行,N个正整数,用空格隔开。
输出说明:3合数区间的个数
输入样例:7

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int array[] = new int[m];
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            array[i] = sc.nextInt();
        }
        sc.close();
        for (int i = 0; i < array.length - 2; i++) {
           if(is(array[i]) && is(array[i+1]) && is(array[i+2])){
               count++;
           }
        }
        System.out.println(count);
    }
    static boolean is(int number){
        for (int i = 2; i < number ; i++) {
            if(number % i == 0){
                return true;
            }
        }
        return false;
    }
}

3.字母连连看,给定一个由小写英文字母组成的字符串(长度<1000),如果字符串中有两个连续的字母相同,则这两个字母可同时消除,并不断重复该操作,直到不能消除为止。请编程判断该字符串是否可以完全消除。
输入说明:一个字符串。
输出说明:如果可以完全消除,输出“YES”,如果不可以,输出消除后的结果。
输入样例1:abacddcaba
输出样例1:YES
输入样例2:asdfghhgf
输出样例2:asd

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String string = sc.nextLine();
        sc.close();
        String result = remove(string);
        if(result.length() == 0){
            System.out.println("YES");
        }else{
            System.out.println(result);
        }
    }
    public static String remove(String string){
        String s = string;
        for (int i = 0; i < string.length() - 1; i++) {
            if(string.charAt(i) == string.charAt(i + 1)){
                s = s.substring(0,i) + s.substring(i+2,string.length());
            }
        }
        if(s.equals(string)){
            return string;
        }else {
            return remove(s);
        }
    }
}

4.由N(N<=10000)个整数组成的数组,其中连续K(K<=200)个元素构成一个区间,称为K区间。一个K区间中所有素数的和记为Sk,请计算整个数组中,所有K区间中的最大Sk值,并输出。
输入说明:第一行是两个整数N和K,第二行输入N个数,表示数组中的元素。
输出说明:最大Sk值
输入样例:8 2
12 23 27 34 19 17 45 8
输出样例:36

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int array[] = new int[N];
        for (int i = 0; i < array.length; i++) {
            array[i] = sc.nextInt();
        }
        sc.close();
        int max = 0;
        for (int i = 0; i < N - K; i++) {
            int temp = 0;
            for (int j = i; j < i + K; j++) {
                if(is(array[j])){
                    temp = temp + array[j];
                    max = Math.max(max,temp);
                }
            }
        }
        System.out.println(max);;
    }
    public static boolean is(int number){
        for (int i = 2; i < number; i++) {
            if(number % i == 0){
                return false;
            }
        }
        return true;
    }
}

5.仓库新进了几批物资,只知道每批物资的数量和单价,请编写程序,按照每种物资的总价值,由高到低次序输出。
输入说明:第1行 一个整数N,表明物资的批次数量
第2-N+1行,每批物资的类别、数量及单价,中间用空格隔开,其中类别用A-Z加以区分。
输出说明:按物资价值降序输出排序结果,每行输出一种物资。
输入样例:5
A 5 10.00
B 3 2.00
A 5 8.00
B 3 2.50
C 10 3.50
输出样例:A 90.00
C 35.00
B 13.50

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Object [][] array = new Object[5][3];
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                array[i][j] = sc.next();
            }
        }
        sc.close();
        Map<String,Double> map = new HashMap<>();
        for (int i = 0; i < N; i++) {
            double sum = Integer.parseInt((String) array[i][1]) * Double.parseDouble((String)array[i][2]);
            String key =  (String) array[i][0];
            if(map.get(key) == null){
                map.put(key,sum);
            }else{
                double temp = map.get(key);
                map.put(key,temp + sum);
            }
        }
        System.out.println(map.get("A"));
        List<Map.Entry<String, Double>> infoIds = new ArrayList<Map.Entry<String, Double>>(map.entrySet());
        //根据value 降序排序
        Collections.sort(infoIds, new Comparator<Map.Entry<String, Double>>() {
            @Override
            public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
                return (int) (o2.getValue() - o1.getValue());
            }
        });
        //注意这里遍历的是list,也就是我们将map.Entry放进了list,排序后的集合
        for (Map.Entry s : infoIds)
        {
            System.out.println(s.getKey() + " " + String.format("%.2f",s.getValue()));
        }

    }

}

6.统计1到N(含)之间所有立方数的个数,并输出这个数目。
提示:立方数的个数,如8是2的立方数,27是3的立方数,9不是立方数。
输入说明:一个整数N(N<100000);
输出说明:立方数的个数
输入样例:200
输出样例:5

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.close();
        int count = 0;
        for (int i = 1; i <= N ; i++) {
            for (int j = 1; j <= i ; j++) {
                if(j * j * j == i){
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

7.统计整数区间[N, M] (N,M<100000)中所有非偶数的合数个数,并输出这个数。
输入说明:两个整数N、M;
输出说明:非偶数的合数个数
输入样例:2 16
输出样例:2

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        sc.close();
        int count = 0;
        for (int i = N; i <= M ; i++) {
            if(i % 2 != 0){
                for(int j = 2;j < i;j++){
                    if(i % j == 0 ){
                        count++;
                        break;
                    }
                }
            }

        }
        System.out.println(count);
    }

}

8.对于给定的字符数组(字符数少于10000),统计其中字母类型、数字类型和符号类型的字符出现次数,其中字母类型是英文字母a-z之间的字符(不区分大小写);数字类型是0-9之间的字符;符号类型是除英文字母、数字及空格外的其它字符。
输入说明:一个字符序列;
输出说明:分三行输出:第一行字母类型,以a-z标识;第二行数字类型,以0-9标识;第三行符号类型,以others标识。每行格式如下:
类别标识 出现次数(中间用一个空格分隔)
输入样例:Hello World!
输出样例:a-z 10
0-9 0
others 1

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        char[]chars = s.toCharArray();
        sc.close();
        int count1 = 0;
        int count2 = 0;
        int count3 = 0;
        for (int i = 0; i < chars.length; i++) {
            int temp = chars[i];
            if (temp == 32){
                continue;
            } else if(temp >= 65 && temp <= 122){
                count1++;
                continue;
            }else if(temp >= 48 && temp <= 57){
                count2++;
                continue;
            }else {
                count3++;
            }
        }

        System.out.println("a-z" + " " + count1);
        System.out.println("0-9" + " " + count2);
        System.out.println("others " + " " + count3);
    }

}

9.由N(N<=10000)个整数组成的数组,其中连续K(K<=200)个元素构成一个区间,称为K区间。一个K区间中任意两个数求其差值的绝对值,其中最大的绝对值记为Dk。请计算整个数组中,所有K区间中的最大Dk值,并输出。
输入说明:第一行是两个整数N和K,第二行输入N个数,表示数组中的元素。
输出说明:最大Dk值。
输入样例:8 2
12 23 27 34 35 36 8 45
输出样例:37

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int array [] = new int [N];
        for (int i = 0; i < N; i++) {
            array[i] = sc.nextInt();
        }
        sc.close();
        int max = 0;
        for (int i = 0; i < N - K ; i++) {
            for (int j = i; j < i + K; j++) {
                max = Math.abs((array[j] - array[j+1]));
            }
        }
        System.out.println(max);
    }

}

10.给定一个只包含0-9、‘+’、‘’的合法数学表达式(长度<1000),规定加号‘+’的优先级高于乘号‘’,请输出计算结果。
输入说明: 合法的数学表达式
输出说明: 输出表达式的计算结果
输入样例: 123+122
输出样例: 360

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String string = sc.nextLine();
        sc.close();
        String [] multiplication = string.split("\\*");
        int result = 1;
        for (int i = 0; i < multiplication.length; i++) {
            String[] add = multiplication[i].split("\\+");
            int count = 0;
            for (int j = 0; j < add.length; j++) {
                count += Integer.parseInt(add[j]);
            }
            result *= count;
        }
        System.out.println(result);
    }

}
上一篇:Java实现模拟登录 需求:给三次机会,并提示还有几次


下一篇:基础数学知识