【每日编程-352期】北京理工大学上机题(一)

教育   2024-11-11 10:03   广西  

北京理工大学上机题(一)


每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399



身份证号的校验身份证号码共18位,最后一位是校验位A[18] : aaaaaabbbbbbbbcccd

校验的规则是如下:

前十七位的权值分别是:

    W[17]:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
    x=(A[0]*W[0]+A[1]*W[1]+A[2]*W[2]+...+A[16]*W[16]) mod 11x和校验位y的对应规则对应如下:
            x:0 1 2 3 4 5 6 7 8 9 10
            y:1 0 x 9 8 7 6 5 4 3 2
    若y等于d则身份证号码正确
        输出格式:aaaaaabbbbbbbbcccd 正确
    若y不等于d则身份证号码不正确
        输出格式:应为:aaaaaabbbbbbbbcccy

输入格式:

身份证号码

输出格式:

身份证号码 正确或者不正确

输入样例:

52242619811105565x

输出样例:

52242619811105565x 正确

解决方法:

(1)算法的基本思想:

需要解决的问题:

问题1:验证输入的身份证的位数,是否是18位

问题2:身份证校验位的确定

(2)代码实现:

#include <iostream>
using namespace std;
int main()
{
    //输入权值数组
    int W[17] = {7910584216379105842};
    //校验位对照表
    char check[] = {'1''0''x''9''8''7''6''5''4''3''2'};
    cout << "请输入您的18位身份证号:" << endl;
    char A[17] = {'0'};
    cin >> A;
    //验证输入的身份证号是否为18位
    int num = strlen(A);
    //cout << num << endl;
    if (num != 18) {
        cout << "身份证号输入不完全,请再次输入。";
        return 0;
    }
    //创建辅助数组,将前17位存到辅助数组中
    int B[17] = {0};
    for (int i = 0; i < 17; i++)
        B[i] = (int)A[i] - 48;

    //计算前17位的权值之和MOD11
    int sum = 0;
    for (int j = 0; j < 17; j++)
        sum += W[j] * B[j];
    int x = sum % 11;
    int y = check[x] - 48;
    if (check[x] == A[17])
    {
        cout << A;
        cout << " "
             << "正确" << endl;
        system("pause");
        return 0;
    }
    else
    {
        for (int i = 0; i < 17; i++)
            cout << B[i];
        if (check[x] == 'x')
            cout << 'x' << endl;
        else
            cout << y << endl;
        system("pause");
        return 0;
    }
    return 0;
}

明日预告:北京理工大学上机题(二)

二分查找{-36 -25 0 12 14 29 35 47 76 100},对上述十个数进行二分查找

输入样例:

请输入您要查找的数据:
14
-25
121

输出样例:

14是第5个数,查找次数为1。
-25是第2个数,查找次数为2。
查找失败。


灰灰考研
最全的【计算机考研】【软件考研】考研信息! 最丰富的共享资料! 最大程度上帮助学渣狗登上研究生大门!
 最新文章