题目

攻克点

  1. 如何将字符转化为数字
  2. 如何将10转化为X
  3. 如何判断数组中各数字加起来是否等于末尾

原理

将字符转化为数字

实现字符转化为数字的关键在于字符的ASCII值(或字符编码)与数字的ASCII值之间的关系。

在计算机内部,每一个字符都有对应的数字编码(ASCII),例如:

  • 字符 '0' 的ASCII值是 48
  • 字符 '1' 的ASCII值是 49
  • 字符 '2' 的ASCII值是 50
  • 依此类推,到字符 '9' 的ASCII值是 57

可通过执行 减去 '0' ,即做两个字符的ASCII值之间的减法操作,例如:

  • 字符 '3',它的ASCII值是 51。
  • '0' 的ASCII值是 48。
  • 所以,'3' - '0' 计算过程是:51 - 48 = 3

这种方式可以方便地将字符表示的数字转化为整数,以便进行数学运算

将10转化为X

  • 可定义一个数组,第十个即为X

判断数组中各数字加起来是否等于末尾

  • 将编码存储于数组中
  • for循环,遇到'-'即跳过
  • 若不跳过,将各个字符转化为数字后与对应位置数字相乘后加起来

代码分析

  1. 定义两个数组,一个用来存储号码,另一个用来存储识别码

    char a[14], mod[12] = "0123456789X";
        scanf("%s", a);

    在C / C++ 中以字符串末尾有不可见 '\0', 所以开数组存储字符的时候一定要多 + 1位留给计算机自动补 '\0';

  2. 定义for循环中的变量,并用for循坏计算各个数经过处理后的总和,遇到'-'跳过

    int i, j = 1, t = 0;
        for (i = 0; i < 12; i++)
        {
            if (a[i] == '-')
                continue;
            t += (a[i] - '0') * j++;
        }
  3. 判断识别码是否正觉,若不正确,更改

    if (mod[t % 11] == a[12])
        {
            printf("Right\n");
        }
        else
        {
            a[12] = mod[t % 11];
            printf("%s\n", a);
        }

完整代码

#include <stdio.h>

int main()
{
    char a[14], mod[12] = "0123456789X";
    scanf("%s", a);

    int i, j = 1, t = 0;
    for (i = 0; i < 12; i++)
    {
        if (a[i] == '-')
            continue;
        t += (a[i] - '0') * j++;
    }

    if (mod[t % 11] == a[12])
    {
        printf("Right\n");
    }
    else
    {
        a[12] = mod[t % 11];
        printf("%s\n", a);
    }

    return 0;
}
最后修改:2025 年 07 月 18 日
如果觉得我的文章对你有用,请随意赞赏