1 条题解

  • 0
    @ 2025-4-8 14:04:47

    本题的核心在于根据给定的校验和计算规则,找出使校验和最后一位为零的缺失数字。具体步骤为:

    1. 确定 ID 号码中 “?” 的位置。
    2. 计算除 “?” 之外其他数字与对应因子乘积的和。
    3. 通过遍历 0 - 9 这 10 个数字,尝试填入 “?” 的位置,计算校验和,找到使校验和最后一位为零的数字。 代码:
    #include <iostream>
    #include <string>
    using namespace std;
    
    // 计算校验和
    int calculateChecksum(const string& id) {
      int factors[] = {9, 3, 7};
      int checksum = 0;
      int factorIndex = 0;
      for (int i = id.size() - 1; i >= 0; --i) {
          if (isdigit(id[i])) {
              checksum += (id[i] - '0') * factors[factorIndex];
          }
          factorIndex = (factorIndex + 1) % 3;
      }
      return checksum;
    }
    
    // 找到缺失的数字
    string findMissingDigit(string id) {
      int missingIndex = id.find('?');
      for (int digit = 0; digit <= 9; ++digit) {
          string newId = id;
          newId[missingIndex] = digit + '0';
          int checksum = calculateChecksum(newId);
          if (checksum % 10 == 0) {
              return newId;
          }
      }
      return "";
    }
    
    int main() {
      int numCases;
      cin >> numCases;
      for (int i = 1; i <= numCases; ++i) {
          string id;
          cin >> id;
          string correctId = findMissingDigit(id);
          cout << "Scenario #" << i << ":" << endl;
          cout << correctId << endl;
          cout << endl;
      }
      return 0;
    }
    
    
    • 1

    信息

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