- C++
B3850 [GESP202306 四级] 幸运数
- 2025-6-4 18:56:50 @
B3850 [GESP202306 四级] 幸运数
题目描述
小明发明了一种 "幸运数"。一个正整数,其偶数位不变(个位为第 位,十位为第 位,以此类推),奇数位做如下变换:将数字乘以 ,如果不大于 则作为变换结果,否则把结果的各位数相加,如果结果不大于 则作为变换结果,否则(结果仍大于 )继续把各位数相加,直到结果不大于 ,作为变换结果。变换结束后,把变换结果的各位数相加,如果得到的和是 的倍数,则称一开始的正整数为幸运数。
例如,:第 位为 ,乘以 结果为 ,大于 ,各位数相加为 ,仍大于 ,继续各位数相加,最后结果为 ;第 位为 ,变换结果为 ;第 位为 ,变换结果为 。最后变化结果为 ,对于结果 其各位数之和为 ,是 的倍数。因此 是幸运数。
输入格式
输入第一行为正整数 ,表示有 个待判断的正整数。约定 。
从第 行开始的 行,每行一个正整数,为待判断的正整数。约定这些正整数小于 。
输出格式
输出 行,对应 个正整数是否为幸运数,如是则输出 'T',否则输出 'F'。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
输入输出样例 #1
输入 #1
2
16347
76344
输出 #1
T
F
2 条评论
-
admin SU @ 2025-6-4 18:58:22已修改
以下是添加详细注释后的代码,解释了每个步骤的逻辑和功能:
#include<iostream> #include<string> #include<algorithm> // 用于reverse函数 using namespace std; // 判断字符串表示的数字是否为"幸运数" bool ok(string& str) { int len = str.size(); reverse(str.begin(), str.end()); // 反转字符串,使个位在索引0位置 int res = 0; // 存储变换后各位数字的和 // 遍历反转后的字符串 for(int i = 0; i < len; i++) { // 位置从1开始计数,所以i+1表示当前字符的实际位置 if((i + 1) % 2 == 1) { // 奇数位置的字符处理 int sz = str[i] - '0'; // 字符转数字 sz *= 7; // 乘以7 // 循环处理,直到结果为个位数 while(sz > 9) { // 这里原代码存在逻辑错误!正确处理应该是: // int sum = 0; // while(sz > 0) { sum += sz % 10; sz /= 10; } // sz = sum; // 但原代码使用了错误的处理方式:sz = sz%10 + sz/10%10; // 这会导致计算结果不正确,例如14会被错误处理为5而不是1+4=5 sz = sz%10 + sz/10%10; } str[i] = sz + '0'; // 数字转回字符 } res += str[i] - '0'; // 累加变换后的数字 } return res % 8 == 0; // 判断总和是否为8的倍数 } int main() { int n; cin >> n; // 读取测试数据数量 string str; getline(cin, str); // 消耗掉cin后的换行符 // 循环处理每个测试数据 for(int i = 1; i <= n; i++) { getline(cin, str); // 读取一行完整的数字字符串 if(ok(str) == true) { cout << "T" << endl; // 是幸运数 } else { cout << "F" << endl; // 不是幸运数 } } return 0; }
代码说明与注意事项
-
字符串反转:
- 使用
reverse
函数将字符串反转,使个位位于索引0位置,方便按位置处理。
- 使用
-
奇数位处理:
- 位置从1开始计数,因此索引i对应的实际位置是i+1。
- 奇数位置的数字需要乘以7,并将结果处理为个位数。
-
输入处理:
- 使用
getline(cin, str)
读取整行输入,避免cin
后残留的换行符影响后续读取。
- 使用
-
逻辑流程:
- 反转字符串后,遍历每个字符,处理奇数位置的数字。
- 累加所有变换后的数字,判断总和是否能被8整除。
-
-
2025-6-4 18:57:01@
#include<iostream> #include<string> #include<algorithm>//reverse using namespace std; bool ok(string& str){ int len = str.size(); reverse(str.begin(),str.end());//"123" "321" VECTOR STRING int res = 0; for(int i=0;i< len;i++){ if((i+1)%2==1){ int sz = str[i] - '0'; sz*=7; while(sz>9){ sz = sz%10 + sz/10%10; } str[i] = sz + '0'; } res += str[i] - '0'; } if(res%8==0){ return true; }else{ return false; } } int main() { int n; cin>>n; string str; //cin getline getline(cin,str);//cin.ignore(); for(int i=1;i<=n;i++){ getline(cin,str); if(ok(str)==true){ cout<<"T"<<endl; }else{ cout<<"F"<<endl; } } return 0; }
- 1