【算法题】CCF CSP模拟练习题(一)

(一)201312-1 出现次数最多的数

问题描述

给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。

输入格式

输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出格式

输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

样例输入

6
10 1 10 20 30 20

样例输出

10

分析

13年12月的签到题,没什么难度,甚至都没有什么边界条件或者数据类型中的陷阱。

代码

(二)201312-2 ISBN号码

问题描述

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出是正确的ISBN号码。

输入格式

输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出格式

输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

样例输入

0-670-82162-4

样例输出

Right

样例输入

0-670-82162-0

样例输出

0-670-82162-4

分析

这个题也比较简单,但是注意一下数据格式吧,比如最后一位可能为X,存储时有所注意。

代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String ISBN = scanner.next();
        int length = ISBN.length();
        int r = 0;
        int count = 1;
        for (int i = 0; i < length - 1; i++) {
            char c = ISBN.charAt(i);
            if (c != '-') {
                r += Integer.parseInt(String.valueOf(c)) * count++;
            }
        }
        r = r % 11;
        String sign = String.valueOf(ISBN.charAt(length - 1));
        String result = String.valueOf(r);
        if (result.equals("10"))
            result = "X";
        if (result.equals(sign)) {
            System.out.println("Right");
        } else {
            System.out.println(ISBN.substring(0, length - 1) + result);
        }
    }
}

(三)201903-1 小中大

题目

分析

这个题虽然也是一道签到题,但是比起上面第一道,坑多了不少,对于像我这样没什么经验的,其中的坑基本都命中了。让我细细分析。
首先题目里要求“对于可能出现的分数,请输出四舍五入保留1位小数的结果”,一方面要保留1位小数,另一方面要四舍五入。一定要特别注意分数的情况,以及中位数的类型是浮点数而不是整数。
另外,注意题干里提到已经是顺序或者逆序,所以可以先判断一下端点从而获得max和min,不需要排序了。要排序也可以直接使用sort函数。

代码
#include <bits/stdc++.h>

using namespace std;

int main () {
    int n;
    int max, min;
    cin>>n;
    int a[n];
    for (int i = 0; i < n; i++)
        cin>>a[i];
    if (a[n - 1] >= a[0]) {
        max = a[n - 1];
        min = a[0];
    } else {
        max = a[0];
        min = a[n - 1];
    }
    double m;
    if (n % 2 == 0) {
        m  = (a[n / 2] + a[n / 2 - 1]) / 2.0;
    } else {
        m =  a[n / 2];
    }
    int pre = (m > 0 &&m-(int)m<0.01) || (m < 0 && m - (int)m > -0.01) || m == 0 ?0:1;
    cout<<max<<" "<<setiosflags(ios::fixed)<<setprecision(pre)<<m<<" "<<min<<endl;
}
发布了75 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Swocky/article/details/97032929