• 身份证扩展(类构造与析构)Java


    目录

    题目描述

    思路分析

    AC代码


    题目描述

    定义一个身份证类,将 15 位的旧版身份证号扩充为 18 位。

    在 15 位身份证号中,第 7、8 两位为出生年份,例如,1980 年出生的人,身份证号码的第 7、8 位的值是 80,在 18 位身份证号中,将 7~10 四位的值改为 1980,并将原身份证号码第 9 位开始以后的所有数字依次向右平移 2 位。在 18 位身份证号中, 最后增加一位校验码,校验码的计算方法如下(只考虑 20 世纪出生的公民):

    (1)将已扩展出的 17 位身份证号按各位上的数字进行加权求和,结果为 S。自左到右各位上的数字的权值依次为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}。

    (2)将 S 对 11 取余运算,结果为 Y。

    (3)根据 Y 的取值大小顺序{0,1,2,3,4,5,6,7,8,9,10}取对应的校验码{1,0,X,9,8,7,6,5,4,3,2}。

    例如,当 15 位身份证号为 340524800101001 时,扩展年份后成 17 位:34052419800101001,各位上的数字的加权和 S=3*7+4*9+0*10+5*5+2*8+4*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2=189,S对11取余,即 S%11=189%11=2,则校验码为“X”。

    要求类定义中包含完整的含参构造函数,默认构造函数,以及析构函数。

    输入

    测试组数t

    以下t行,输入15位身份证号

    输出

    每个实例包含三行输出

    第1行,在构造函数输出原身份证号,看样例

    第2行,调用类方法输出扩展后的身份证号,看样例

    第3行,在析构函数输出提示信息,包含扩展后身份号末4位,看样例

    输入样例1

    2
    340524800101001
    310001000101452

    输出样例1

    construct ID=340524800101001
    upgrade ID=34052419800101001X
    destruct ID=001X
    construct ID=310001000101452
    upgrade ID=310001190001014527
    destruct ID=4527

    思路分析

    首先Java没有严格意义上的析构函数……它有自己的垃圾回收机制,所以析构的直接跳过不讲。

    之后是Java的String是不能变的和python一样,所以我们要用StringBuffer类型来完成插入修改工作。整个字符串的使用都用StringBuffer类型来操作。

    依然采用数组相乘的方式来计算校验码。

    在Java的世界里,一切皆对象,连个字符串也是一个对象,这意味着我们不能再像python或C系列那样使用下标来访问单个字符,我们只能用它的成员函数来访问单个字符。

    最后一个难题,怎么从键盘读取一个StringBuffer类型的字符串?

    直接读取只能读取一个String的对象。

    但是在创建StringBuffer类型的时候可以调用带参数的构造函数,直接从键盘读取String类对象作为参数创建StringBuffer类型对象,我真是天才^_^

    AC代码

    1. import java.util.Scanner;
    2. class ID{
    3. StringBuffer pastID=new StringBuffer(),nowID=new StringBuffer();
    4. public ID(StringBuffer ID) {
    5. this.nowID=this.pastID=ID;
    6. }
    7. public void update() {
    8. nowID.insert(6,"19");
    9. int power[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    10. int codeindex=0,i;
    11. for(i=0;i<17;i++)
    12. codeindex+=power[i]*((int)nowID.charAt(i)-'0');
    13. codeindex%=11;
    14. String code="10X98765432";
    15. nowID.insert(nowID.length(),code.charAt(codeindex));
    16. System.out.printf("upgrade ID=%s\ndestruct ID=%s\n",nowID,nowID.substring(14));
    17. }
    18. }
    19. public class Main {
    20. public static void main(String[] args) {
    21. Scanner scan=new Scanner(System.in);
    22. int t=scan.nextInt();
    23. while(t-->0){
    24. StringBuffer ID=new StringBuffer(scan.next());
    25. ID id=new ID(ID);
    26. id.update();
    27. }
    28. }
    29. }
  • 相关阅读:
    图论---最小生成树问题
    基于inquirer实现一个控制台多级选择交互功能
    windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)
    0X03
    设计模式六大原则
    【Unity100个实用小技巧】如何修改UI上材质的Shader
    【学习】自动化测试与单元测试框架的差异化解析
    大促前夕即高点,综合电商平台的“稀缺”魔法正在消失?
    在Postman中使用 FineBI提供的接口获取数据
    推进高校学生党建工作数字化建设的思考
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/126139762