当前位置:首页 > 比赛题解 > 2023年GESP四级真题解析:幸运数的判定算法详解

2023年GESP四级真题解析:幸运数的判定算法详解

2天前比赛题解55

截图未命名.jpg 2023年GESP四级真题解析:幸运数的判定算法详解 GESP四级 数字根计算 字符串处理 模运算 数字变换 第1张

一、问题背景

题目要求判断一个数是否为"幸运数",定义规则为:

  1. 从个位开始编号为第1位

  2. 奇数位数字要经过特殊变换

  3. 所有位数字相加的和是8的倍数

二、算法核心思想

  1. 数字位数处理:将数字转为字符串便于逐位处理

  2. 奇数位变换:乘以7后求数字根(各位相加直到个位数)

  3. 模运算判断:验证各位和是否为8的倍数

三、完整代码解析(带详细注释)

#include <iostream>
#include <string>
using namespACe std;

// 处理奇数位数字变换
int transformDigit(int digit) {
    digit *= 7;  // 先乘以7
    // 循环处理直到数字不大于9
    while (digit > 9) {
        int sum = 0;
        // 计算各位数字之和
        while (digit > 0) {
            sum += digit % 10;
            digit /= 10;
        }
        digit = sum;
    }
    return digit;
}

// 判断是否为幸运数
bool isLuckyNumber(long long num) {
    string s = to_string(num);
    int sum = 0;
    
    // 从个位开始(第1位),所以从字符串末尾开始处理
    for (int i = s.length() - 1, pos = 1; i >= 0; i--, pos++) {
        int digit = s[i] - '0';
        // 奇数位进行变换,偶数位保持不变
        if (pos % 2 == 1) {
            digit = transformDigit(digit);
        }
        sum += digit;
    }
    // 判断和是否是8的倍数
    return sum % 8 == 0;
}

int main() {
    int N;
    cin >> N;
    
    while (N--) {
        long long num;
        cin >> num;
        if (isLuckyNumber(num)) {
            cout << "T" << endl;
        } else {
            cout << "F" << endl;
        }
    }
    
    return 0;
}

四、关键知识点详解

  1. 数字根计算:通过循环取模和除法实现数字压缩

  2. 字符串处理:to_string和字符转数字技巧(-'0')

  3. 奇偶位区分:通过位置计数器(pos)的奇偶性判断

  4. 反向遍历:从字符串末尾开始处理个位数字

五、实际应用场景

  1. 校验码生成算法

  2. 数字加密变换

  3. 游戏特殊数值判定

  4. 数学趣味问题求解

六、学习建议

  1. 尝试修改变换规则(如乘以其他数)

  2. 思考如何优化数字根计算过程

  3. 练习处理更大范围的数字(高精度

  4. 比较字符串处理和数学取位两种实现方式的差异


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。