两种题解,字符串或者拆位相加
2026-05-30 14:15:34
发布于:湖北
32阅读
0回复
0点赞
"幸运数"判断 详细题解
题目分析
核心规则
-
位数编号:从右往左,个位是第1位,十位是第2位,百位是第3位...
-
变换规则:
- 偶数位(第2, 4, 6...位):数字保持不变
- 奇数位(第1, 3, 5...位):数字乘以7,然后反复数位求和直到结果≤9
-
幸运数判定:变换后所有数位之和是8的倍数
样例验证
16347的变换过程:
原数:1 6 3 4 7
位置:5 4 3 2 1(从右往左)
位置1(奇数):7 → 7×7=49 → 4+9=13 → 1+3=4
位置2(偶数):4 → 4(不变)
位置3(奇数):3 → 3×7=21 → 2+1=3
位置4(偶数):6 → 6(不变)
位置5(奇数):1 → 1×7=7
变换结果:7 6 3 4 4
数位和:7+6+3+4+4 = 24
24 ÷ 8 = 3,整除 → 是幸运数,输出 'T'
76344的变换过程:
原数:7 6 3 4 4
位置:5 4 3 2 1
位置1(奇数):4 → 4×7=28 → 2+8=10 → 1+0=1
位置2(偶数):4 → 4(不变)
位置3(奇数):3 → 3×7=21 → 2+1=3
位置4(偶数):6 → 6(不变)
位置5(奇数):7 → 7×7=49 → 4+9=13 → 1+3=4
变换结果:4 6 3 4 1
数位和:4+6+3+4+1 = 18
18 ÷ 8 = 2...2,不整除 → 不是幸运数,输出 'F'
代码实现1
#include <iostream>
using namespace std;
// 函数:处理奇数位的变换规则
// 1. 数字乘以 7
// 2. 如果结果大于 9,则各位数相加,循环直到结果不大于 9
int transform(int digit) {
int res = digit * 7;
while (res > 9) {
int sum = 0;
int temp = res;
// 数位求和
while (temp > 0) {
sum += temp % 10;
temp /= 10;
}
res = sum;
}
return res;
}
int main() {
int N;
if (cin >> N) {
while (N--) {
long long num;
cin >> num;
int pos = 1; // 记录当前是第几位,从 1 开始(个位)
int total_sum = 0; // 记录变换后的各位数字之和
// 当 num 大于 0 时循环,从右往左逐位处理
while (num > 0) {
int digit = num % 10; // 取出当前最低位(个位)
// 判断当前是奇数位还是偶数位
if (pos % 2 == 1) {
// 奇数位:执行变换规则
total_sum += transform(digit);
} else {
// 偶数位:数字不变,直接累加
total_sum += digit;
}
// 准备处理下一位
num /= 10; // 去掉已经处理过的最低位
pos++; // 位置计数器 +1
}
// 判断总和是否是 8 的倍数
if (total_sum % 8 == 0) {
cout << "T" << endl;
} else {
cout << "F" << endl;
}
}
}
return 0;
}
代码实现2
#include <iostream>
#include <string>
using namespace std;
// 变换奇数位上的数字
int transform(int d) {
int result = d * 7;
// 反复数位求和直到结果≤9
while (result > 9) {
int sum = 0;
int temp = result;
while (temp > 0) {
sum += temp % 10;
temp /= 10;
}
result = sum;
}
return result;
}
int main() {
int N;
cin >> N;
while (N--) {
string s;
cin >> s;
int total_sum = 0;
int len = s.length();
// 从右往左处理(位置1是最右边的个位)
for (int i = len - 1; i >= 0; i--) {
int pos = len - i; // 计算位置(从右往左,1-indexed)
int digit = s[i] - '0';
if (pos % 2 == 1) {
// 奇数位:需要变换
total_sum += transform(digit);
} else {
// 偶数位:保持不变
total_sum += digit;
}
}
// 判断是否是8的倍数
if (total_sum % 8 == 0) {
cout << "T" << endl;
} else {
cout << "F" << endl;
}
}
return 0;
}
关键点说明
1. 位置计算
// 字符串索引:0 1 2 3 4
// 数字: 1 6 3 4 7
// 实际位置: 5 4 3 2 1(从右往左)
int pos = len - i; // i是当前字符的索引
2. 数位求和函数
// 49 → 4+9=13 → 1+3=4
// 需要循环直到结果≤9
3. 数据类型
- 输入数字最大10^12,用
string存储更方便处理各位数字 - 数位和最大约12×9=108,用
int足够
复杂度分析
- 时间复杂度:O(N × L),其中N是测试用例数,L是数字的位数(最多12位)
- 空间复杂度:O(L),存储字符串
测试建议
可以测试以下边界情况:
- 单个数字:1, 8, 9
- 两位数:10, 99
- 大数:999999999999
这里空空如也



有帮助,赞一个