C语言程序设计基础|身份证升位

题目描述:

第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入19;第二步,按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号。

校验码计算方法:将身份证前十七位数分别乘以7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2,将这十七位数字和系数相乘的结果相加,用加出来的和除以11,看看余数是多少。余数只可能有0、1、2、3、4、5、6、7、8、9、10这十一个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,这样就得出了第二代身份证第十八位数的校验码。

输入15位身份证号,对其升位,输出升位后的18位身份证号。

输入要求:

测试次数T

每组测试数据为15位身份证号

输出要求:

对每组测试数据,给出升位后的18位身份证号。

#include
#include
#include
#include
#include
using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--)
    {
        char arr[18];//以字符的形式输入
        cin >> arr;
        for (int i = 16; i > 5; i--)//第6位之后的后移两位
        {
            arr[i] = arr[i - 2];
        }
        int sum = 0;
        arr[6] = '1';
        arr[7] = '9';
        int brr[18];
        for (int j = 0; j < 17; j++)
        {
            brr[j] = arr[j] - '0';//将数组从字符串改成整型
        }
        sum = 7 * brr[0] + 9 * brr[1] + 10 * brr[2] + 5 * brr[3] + 8 * brr[4] + 4 * brr[5] + 2 * brr[6] + 1 * brr[7] + 6 * brr[8] + 3 * brr[9] + 7 * brr[10] + 9 * brr[11] + 10 * brr[12] + 5 * brr[13] + 8 * brr[14] + 4 * brr[15] + 2 * brr[16];
        int r = sum % 11;
        switch (r)//选择循环
        {
        case 0: arr[17] = '1'; break;
        case 1: arr[17] = '0'; break;
        case 2: arr[17] = 'X'; break;
        case 3: arr[17] = '9'; break;
        case 4: arr[17] = '8'; break;
        case 5: arr[17] = '7'; break;
        case 6: arr[17] = '6'; break;
        case 7: arr[17] = '5'; break;
        case 8: arr[17] = '4'; break;
        case 9: arr[17] = '3'; break;
        case 10: arr[17] = '2'; break;
        }
        for (int k = 0; k < 18; k++)
        {
            cout << arr[k];
        }
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(Simple,C,c语言,c++,算法)