- 打卡等级:即来则安
- 打卡总天数:21
- 打卡月天数:9
- 打卡总奖励:137
- 最近打卡:2025-07-13 16:05:00
VIP会员
- 积分
- 4500
|
一、问题背景 题目要求判断一个数是否为"幸运数",定义规则为: 从个位开始编号为第1位 奇数位数字要经过特殊变换 所有位数字相加的和是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;
- }
复制代码
四、关键知识点详解字符串处理:to_string和字符转数字技巧(-'0') 奇偶位区分:通过位置计数器(pos)的奇偶性判断 反向遍历:从字符串末尾开始处理个位数字
五、实际应用场景校验码生成算法 数字加密变换 游戏特殊数值判定 数学趣味问题求解
六、学习建议尝试修改变换规则(如乘以其他数) 比较字符串处理和数学取位两种实现方式的差异
来源:2023年GESP四级真题解析:幸运数的判定算法详解
|
|