C++ 幸运数判断算法:详解与代码实现
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 是幸运数。
算法实现
- 定义变换函数:
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;
}
该函数接受一个正整数作为参数,并返回变换后的结果。
- 主函数处理输入和输出:
#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;
}
希望本文能够帮助您理解和实现幸运数判断算法。
原文地址: https://www.cveoy.top/t/topic/ph64 著作权归作者所有。请勿转载和采集!