身份证号码合法性校验(加权平均数)

期末考试半天悟不出权重的概念,待悟出为时已晚

加权平均数介绍

加权平均数是一种平均数的计算方式,其中每个数据点的贡献度是不同的,贡献度由权重决定。与普通的算术平均数不同,加权平均数将每个数据的值乘以相应的权重,再求和,最后除以所有权重的总和。加权平均数通常用于数据中不同元素的重要性不相同的情况。

加权平均数的公式

加权平均数的计算公式为:

加权平均数 = (w1 * x1 + w2 * x2 + ... + wn * xn) / (w1 + w2 + ... + wn)

其中:

  • x1, x2, ..., xn 是数据值。
  • w1, w2, ..., wn 是相应的权重。
  • 加权平均数 是加权平均值。

举例说明

假设有三个数值 5, 7, 和 9,分别对应的权重为 1, 2, 和 3。那么它们的加权平均数计算如下:

加权平均数 = (1 * 5 + 2 * 7 + 3 * 9) / (1 + 2 + 3) = (5 + 14 + 27) / 6 = 46 / 6 ≈ 7.67

代码示例

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 校验身份证号码的权重数组
int weights[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 校验码对应规则
char checkCodes[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
// 校验身份证号码是否合法
int validateIDCard(const char *id)
{
    // 计算校验码
    int sum = 0;
    for (int i = 0; i < 17; i++)
    {
        sum += (id[i] - '0') * weights[i];
    }

    int mod = sum % 11;
    char expectedCheckCode = checkCodes[mod];
    // 校验码比较
    if (toupper(id[17]) != expectedCheckCode)
    {
        return 0;
    }
    return 1;
}

int main()
{
    char id[19];
    printf("请输入身份证号码:");
    scanf("%18s", id);
    if (validateIDCard(id))
    {
        printf("身份证号码合法\n");
    }
    else
    {
        printf("身份证号码不合法\n");
    }
    return 0;
}

LICENSED UNDER CC BY-NC-SA 4.0
Comment