C++ 幸运数判断算法:详解与代码实现

本文将介绍如何使用 C++ 编写程序来判断一个正整数是否为幸运数。

幸运数定义

一个正整数,其偶数位不变(个位为第 1 位,十位为第 2 位,以此类推),奇数位做如下变换:将数字乘以 7,如果不大于 9 则作为变换结果,否则把结果的各位数相加,如果结果不大于 9 则作为变换结果,否则(结果仍大于 9)继续把各位数相加,直到结果不大于 9,作为变换结果。变换结束后,把变换结果的各位数相加,如果得到的和是 8 的倍数,则称一开始的正整数为幸运数。

示例

例如,16347:

  • 第 1 位为 7,乘以 7 结果为 49,大于 9,各位数相加为 13,仍大于 9 继续各位数相加,最后结果为 4;
  • 第 3 位为 3,变换结果为 3;
  • 第 5 位为 1,变换结果为 7。

最后变化结果为 76344,对于结果 76344 其各位数之和为 24,是 8 的倍数,因此 16347 是幸运数。

算法实现

  1. 定义变换函数:
int transform(int num) {
    int result = 0;
    int multiplier = 1;
    while (num > 0) {
        int digit = num % 10;
        if (multiplier % 2 == 0) {
            result += digit * multiplier;
        } else {
            int temp = digit * 7;
            while (temp > 9) {
                temp = temp % 10 + temp / 10;
            } 
            result += temp;
        } 
        num /= 10;
        multiplier++;
    }
    return result;
}

该函数接受一个正整数作为参数,并返回变换后的结果。

  1. 主函数处理输入和输出:
#include <iostream>

using namespace std;

// ... (transform 函数代码)

int main() {
    int N;
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        long long num;
        cin >> num;
        
        int sum = 0;
        while (num > 9) {
            sum += num % 10;
            num /= 10;
        }
        sum += num;
        
        int transformed = transform(num);
        sum += transformed;
        
        if (sum % 8 == 0) {
            cout << 'T' << endl;
        } else {
            cout << 'F' << endl;
        }
    }
    
    return 0;
}

主函数首先读取输入的正整数个数 N,然后使用一个循环来读取每个正整数并判断是否为幸运数。我们在循环中调用变换函数来计算变换后的结果,并判断最后的和是否为 8 的倍数。

代码优化

  • 使用 long long 类型: 输入的正整数可能很大,因此需要使用 long long 类型来存储它们,防止溢出。
  • 减少循环次数: 在计算各位数之和时,可以将循环和判断条件合并,减少循环次数。
  • 代码注释: 添加必要的注释,方便理解代码逻辑。

完整代码

#include <iostream>

using namespace std;

int transform(int num) {
    int result = 0;
    int multiplier = 1;
    while (num > 0) {
        int digit = num % 10;
        if (multiplier % 2 == 0) { // 偶数位直接加倍
            result += digit * multiplier;
        } else { // 奇数位进行特殊变换
            int temp = digit * 7;
            while (temp > 9) { // 如果结果大于9,则继续求各位数之和
                temp = temp % 10 + temp / 10;
            }
            result += temp;
        }
        num /= 10;
        multiplier++;
    }
    return result;
}

int main() {
    int N;
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        long long num;
        cin >> num;
        
        int sum = 0;
        while (num > 0) { // 计算输入数字各位数之和
            sum += num % 10;
            num /= 10;
        }
        
        int transformed = transform(num); // 调用transform函数进行变换
        sum += transformed; // 将变换后的结果加入sum
        
        if (sum % 8 == 0) { // 判断是否为8的倍数
            cout << 'T' << endl;
        } else {
            cout << 'F' << endl;
        }
    }
    
    return 0;
}

希望本文能够帮助您理解和实现幸运数判断算法。

C++ 幸运数判断算法:详解与代码实现

原文地址: https://www.cveoy.top/t/topic/ph64 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录