欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
【题目来源】
洛谷:[B3850 GESP202306 四级] 幸运数 - 洛谷
【题目描述】
小明发明了一种 “幸运数”。一个正整数,其偶数位不变(个位为第1 11位,十位为第2 22位,以此类推),奇数位做如下变换:将数字乘以7 77,如果不大于9 99则作为变换结果,否则把结果的各位数相加,如果结果不大于9 99则作为变换结果,否则(结果仍大于9 99)继续把各位数相加,直到结果不大于9 99,作为变换结果。变换结束后,把变换结果的各位数相加,如果得到的和是8 88的倍数,则称一开始的正整数为幸运数。
例如,16347 1634716347:第1 11位为7 77,乘以7 77结果为49 4949,大于9 99,各位数相加为13 1313,仍大于9 99,继续各位数相加,最后结果为4 44;第3 33位为3 33,变换结果为3 33;第5 55位为1 11,变换结果为7 77。最后变化结果为76344 7634476344,对于结果76344 7634476344其各位数之和为24 2424,是8 88的倍数。因此16347 1634716347是幸运数。
【输入】
输入第一行为正整数N NN,表示有N NN个待判断的正整数。约定1 ≤ N ≤ 20 1 \le N \le 201≤N≤20。
从第2 22行开始的N NN行,每行一个正整数,为待判断的正整数。约定这些正整数小于1 0 12 10^{12}1012。
【输出】
输出N NN行,对应N NN个正整数是否为幸运数,如是则输出T,否则输出F。
提示:不需要等到所有输入结束再依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
【输入样例】
2 16347 76344【输出样例】
T F【算法标签】
《洛谷 B3850 幸运数》 #函数与递归# #GESP# #2023#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong// 使用长整型constintN=15;// 数组大小,用于存储数字的各位intn;// 测试用例数量inta[N];// 存储数字的各位数字/** * 递归计算数字的数字根 * 数字根:反复将数字的各位相加,直到得到一位数 * 例如:38 -> 3+8=11 -> 1+1=2 * @param x 输入数字 * @return 数字根 */intcalc(intx){// 调试输出// cout << "x " << x << endl;// 如果已经是一位数,直接返回if(x<=9){returnx;}// 计算各位数字之和intres=0;while(x){res+=x%10;// 加上个位数字x/=10;// 去掉个位}// 递归计算数字根returncalc(res);}/** * 检查数字是否符合特定规则 * 规则: * 1. 从个位开始(第1位),奇数位置的数字乘以7 * 2. 计算乘积的数字根 * 3. 所有处理后的数字之和能被8整除 * @param x 要检查的数字 * @return 如果处理后数字之和能被8整除返回true,否则false */boolcheck(intx){// 将数字分解为各位数字intcur=0;// 数字位数while(x){a[++cur]=x%10;// 存储个位x/=10;// 去掉个位}// 处理奇数位置的数字for(inti=1;i<=cur;i++){if(i%2==1)// 奇数位置(从个位开始算第1位){inttmp=a[i]*7;// 乘以7a[i]=calc(tmp);// 计算数字根}}// 计算处理后的数字之和intans=0;for(inti=1;i<=cur;i++){ans+=a[i];}// 判断和是否能被8整除returnans%8==0;}signedmain()// 因为使用了#define int long long{// 输入测试用例数量cin>>n;// 处理每个测试用例while(n--){intx;cin>>x;// 检查数字并输出结果if(check(x)){cout<<"T"<<endl;// 符合条件}else{cout<<"F"<<endl;// 不符合条件}}return0;}【运行结果】
2 16347 T 76344 F