#3908. [GESP2306 四级] 幸运数
[GESP2306 四级] 幸运数
幸运数
题目描述
小明发明了一种“幸运数”。一个正整数,其偶数位不变(个位为第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是幸运数。
输入格式
输入第一行为正整数 ,表示有 个待判断的正整数。约定 。 从第2行开始的 行, 每行一个正 整数,为待判断的正整数。1 ≤约 定≤这2些0正整 数小于 。
12 【输出1描0述】 输出 行,对应 个正整数是否为幸运数,如是则输出'T',否则输出'F'。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数 并输出,再输入下一个数。 【样例输入1】 2 16347 76344 【样例输出1】 T F 【参考程序】 #include using namespace std; // 奇数位要做的数字变换 int trans(int t) { if (t == 0) return 0; return (t * 7 - 1) % 9 + 1; } // 判断是否为幸运数 bool judge(long long x) { int sum = 0; for (int d = 1; x > 0; d++, x /= 10) { int t = (int)(x % 10); if (d % 2 == 0) sum += t; else sum += trans(t); } return (sum % 8 == 0); } int main() { int N = 0; cin >> N; for (int n = 0; n < N; n++) { long long x = 0; cin >> x; if (judge(x)) cout << "T" << endl; else cout << "F" << endl; } return 0; }
输出格式
样例输入 #1
2
16347
样例输出 #1
T
F
数据范围
见题目描述
知识点与难度
本题涉及的知识点从属于 GESP 4级,难度等级:⭐⭐⭐ 。
测试点分布
| Subtask | 分值 | 测试点编号 | 说明 |
|---|---|---|---|
| 0 | 10 | 1~2 | 样例 |
| 1 | 20 | 3~8 | 小规模 / 特殊性质 |
| 2 | 15 | 9~11 | Hack |
| 3 | 30 | 12~20 | 中大规模 |
| 4 | 25 | 21~25 | 随机回归 |
生测试数据后,按实际 subtask 分组改写上表。