1 条题解

  • 0
    @ 2025-5-19 12:33:54

    题意分析

    题目要求实现一种名为 QuicksumQuicksum 的校验和算法。该算法用于计算数据包的校验和,具体规则如下:

    1. 数据包格式

      • 仅包含大写字母和空格。
      • 不以空格开头或结尾。
      • 长度在 11255255 个字符之间。
    2. 校验和计算

      • 将数据包中每个字符的位置(从 11 开始)乘以该字符的对应值,再将所有乘积相加。
      • 空格的值为 00
      • 字母的值为其在字母表中的顺序(A=1A=1B=2B=2,……,Z=26Z=26)。
    3. 示例

      • 数据包 "ACMACM" 的校验和为 1×1+2×3+3×13=461 \times 1 + 2 \times 3 + 3 \times 13 = 46
      • 数据包 "MIDCENTRALMID CENTRAL" 的校验和为 $1 \times 13 + 2 \times 9 + 3 \times 4 + 4 \times 0 + 5 \times 3 + 6 \times 5 + 7 \times 14 + 8 \times 20 + 9 \times 18 + 10 \times 1 + 11 \times 12 = 650$。

    解题思路

    关键点分析

    1. 字符值映射

      • 空格映射为 00
      • 大写字母 AAZZ 分别映射为 112626
    2. 位置与值的乘积

      • 数据包中每个字符的位置(从 11 开始)乘以对应的字符值。
      • 将所有乘积相加得到校验和。

    解决步骤

    1. 输入处理

      • 逐行读取输入,直到遇到单独的一行 # 为止。
      • 对每个数据包进行处理。
    2. 字符值计算

      • 对于每个字符:
        • 如果是空格,值为 00
        • 如果是大写字母,值为 ord(char)ord(A)+1`ord(char) - ord('A') + 1`(即字母在字母表中的顺序)。
    3. 校验和计算

      • 遍历数据包的每个字符,计算 位置 × 字符值 并累加。
    4. 输出结果

      • 对每个数据包输出计算得到的校验和。

    算法复杂度

    • 时间复杂度:O(n)O(n),其中 nn 是数据包的长度。每个字符只需常数时间处理。
    • 空间复杂度:O(1)O(1),仅需常数空间存储中间结果。

    #include <stdio.h>
    int main()
    {
        char c;
        int sum = 0,pos = 1;
        while(1)
        {
            c = getchar();
            if(c == '#')
                break;
            else if (c == '\n')
            {
                printf("%d\n",sum);
                sum = 0;
                pos = 1;
                continue;
            }
            else
            {
                sum += (c == ' ') ? 0 : pos*(c - 'A' + 1);
                pos++;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2095
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者