top1编程
← 返回题目
题解

注册账号

1 条题解

  • 0
    @ 2026-8-5 23:48:47

    P4627 注册账号(基础)

    解题思路

    网站收集了 N 个人的注册账号,有两种类型:i 表示身份证号,q 表示 QQ 号。对于身份证号,要看第 17 位数字(也就是字符串里下标 16 的那一位)判断性别:奇数是男性,偶数是女性。注意第 18 位(最后一位)可能是 X,但第 17 位一定是数字,所以直接用它减字符 '0' 就能得到数字。对于 QQ 号,要累加起来算平均值,平均值保留 3 位小数。

    举一个具体的例子:身份证号 522635197008278006 的第 17 位是 0,是偶数,算女性;51170219740419175X 的第 17 位是 5,是奇数,算男性。QQ 号 505165 和 34012459 的平均值是 17258812,输出 17258812.000。身份证和 QQ 号都用字符串读入,长度可能不同,字符数组开 30 足够。

    这道题里 QQ 号可能非常大(有十几位数字),n 最多到 10000,所以总和会超出普通整数的范围,我们把它转换成 double 来计算平均值,输出时用 fixed 和 setprecision(3) 保留 3 位小数。如果没有任何 QQ 号,平均值输出 0.000,避免除数为零。

    参考代码

    // 用途:统计身份证中男女数量,并计算QQ号平均值(保留3位小数)。
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main() {
        int n;                              // 账号总数
        cin >> n;                           // 读入账号总数
        int male = 0;                       // 身份证中男性人数
        int female = 0;                     // 身份证中女性人数
        long long sum = 0;                  // 所有QQ号的总和
        int count = 0;                      // QQ号的数量
    
        for (int i = 0; i < n; i++) {       // 依次读入每个账号
            char type;                      // 账号类型,i表示身份证,q表示QQ号
            char info[30];                  // 账号信息字符串
            cin >> type >> info;            // 读入账号类型和信息
            if (type == 'i') {              // 身份证号需要判断性别
                int gender = info[16] - '0'; // 身份证第17位数字表示性别
                if (gender % 2 == 1) {      // 奇数表示男性
                    male++;
                } else {                    // 偶数表示女性
                    female++;
                }
            } else {                        // 其余情况是QQ号
                long long q = 0;            // 当前QQ号的数值
                for (int j = 0; info[j] != '\0'; j++) { // 逐位读取QQ号
                    q = q * 10 + (info[j] - '0');       // 把字符数字加入数值
                }
                sum += q;                   // 累加QQ号
                count++;                    // QQ号数量加一
            }
        }
    
        double avg = 0.0;                   // QQ号平均值
        if (count > 0) {                    // 有QQ号时才计算平均值
            avg = (double)sum / count;      // 平均值 = 总和 ÷ 个数,保留3位小数
        }
        cout << male << ' ' << female << ' '
             << fixed << setprecision(3) << avg << endl; // 输出男女数量和平均值
        return 0;                           // 程序结束
    }
    

    复杂度分析

    每个账号处理一次,时间复杂度 O(N),N 最大 10000。空间 O(1),只用了几个计数器和累加变量。读入时第一个字符是类型,后面紧跟一个字符串,中间用空格隔开。QQ 号可能是 1 到 18 位,用字符串读入再逐位转成数字,能正确处理前导零,比如“0307”会转成 307,不会因为开头有 0 而出错。

    • 1