身份证升位(字符串)(深大oj题)(初学者解答)

CSDN比较少上传文章,欢迎关注我的掘金账号:杨灿就是杨火山,一起学习,一起交流~

**题目描述:**
第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入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位身份证号。

**样例输入**
2
530102200508011
432831641115081

**样例输出**
53010219200508011X
432831196411150810

**读题分析出要实现的功能开始建模:**
1.在原十五位数身份证的第六位数后面插入19 。
2.根据对应法则,分别相乘前面的17位数再除以11再对应输出得到的十八位数字。
3.注意这里因为有x,要用字符串输入
scanf(“%s”,&arr);
arr代表字符串不用【】

**功能实现:**
1.可以定义两个数组,将十五位数字的放在第一个数组arr中,将其中前六位先赋给第二组数组brr,再将1和9赋给brr,最后将arr中后面的九个数赋给brr既实现了功能了
2.这个功能是本题的亮点,有一种简便的代码方法解决这种对应关系,那就是命名两个数组,利用序号上的关系对应相乘,除以十一后再对应输出。

**代码实现:**

#include<stdio.h>
int main()
{ 
int t;
char arr[16],brr[19];
scanf("%d",&t);


while(t--)
/*这个很好用的*/
{
scanf("%s",&arr);
for(int i=0;i<6;i++)
{
brr[i]=arr[i];
}

brr[6]='1';
brr[7]='9';

for(int i=8;i<=16;i++)
{
brr[i]=arr[i-2];
}
/*下面是难点了,对应关系和字符串和整型的转换*/
int crr[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char drr[12]={'1','0','X','9','8','7','6','5','4','3','2','\0'};
/*字符串初始值时不要忘了‘’*/ 
int sum=0;
for(int i=0;i<17;i++)
{
sum=sum+crr[i]*(brr[i]-'0');
} 
sum%=11;

brr[17]=drr[sum];

brr[18]='\0'; 

printf("%s\n",brr);
}


return 0;

}



***************************
这是本宝第二次写的博客,单纯是为了在自己的修仙路上增加些乐子加深印象和方便以后复习,有不对的请指正哦,不喜勿喷,
要是喜欢请给我点赞,这也会给我这个苦逼可怜的狗狗多一些动力呢。

CSDN比较少上传文章,欢迎关注我的掘金账号:杨灿就是杨火山,一起学习,一起交流~

**题目描述:**
第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入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位身份证号。

**样例输入**
2
530102200508011
432831641115081

**样例输出**
53010219200508011X
432831196411150810

**读题分析出要实现的功能开始建模:**
1.在原十五位数身份证的第六位数后面插入19 。
2.根据对应法则,分别相乘前面的17位数再除以11再对应输出得到的十八位数字。
3.注意这里因为有x,要用字符串输入
scanf(“%s”,&arr);
arr代表字符串不用【】

**功能实现:**
1.可以定义两个数组,将十五位数字的放在第一个数组arr中,将其中前六位先赋给第二组数组brr,再将1和9赋给brr,最后将arr中后面的九个数赋给brr既实现了功能了
2.这个功能是本题的亮点,有一种简便的代码方法解决这种对应关系,那就是命名两个数组,利用序号上的关系对应相乘,除以十一后再对应输出。

**代码实现:**

#include<stdio.h>
int main()
{ 
int t;
char arr[16],brr[19];
scanf("%d",&t);


while(t--)
/*这个很好用的*/
{
scanf("%s",&arr);
for(int i=0;i<6;i++)
{
brr[i]=arr[i];
}

brr[6]='1';
brr[7]='9';

for(int i=8;i<=16;i++)
{
brr[i]=arr[i-2];
}
/*下面是难点了,对应关系和字符串和整型的转换*/
int crr[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char drr[12]={'1','0','X','9','8','7','6','5','4','3','2','\0'};
/*字符串初始值时不要忘了‘’*/ 
int sum=0;
for(int i=0;i<17;i++)
{
sum=sum+crr[i]*(brr[i]-'0');
} 
sum%=11;

brr[17]=drr[sum];

brr[18]='\0'; 

printf("%s\n",brr);
}


return 0;

}



***************************
这是本宝第二次写的博客,单纯是为了在自己的修仙路上增加些乐子加深印象和方便以后复习,有不对的请指正哦,不喜勿喷,
要是喜欢请给我点赞,这也会给我这个苦逼可怜的狗狗多一些动力呢。

猜你喜欢

转载自blog.csdn.net/qq_40618238/article/details/78705169