题解
注册账号
1 条题解
-
0
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