算法题(10):好数
审题:
需要判断出1-N的范围内有多少个好数,并输出
思路:
遍历数据:需要用for循环(从1循环到N)
每一位判断:用while循环,先从个位开始,每循环一次就让记录位数的变量++,且要让数据i少一位。
判断条件:如果是奇数位且i取余2后余数是0,说明不是好数。
如果是偶数位且i取余2后余数不是0,说明不是好数。
解题:
由于我们需要数据本身,又需要位数。
所以我们让输入的数据是string类型,先通过size取到位数,然后通过stoi转回int型数据
(1)由于我们需要记录是否该数是好数,所以设置了sign变量,当他为1的时候代表是好数,为0代表不是好数。
只有当该数是好数时我们才会让cou++,表示好数的数量加一
(2)由于i需要不断++,所以我们判断的过程不能改变i的值,于是用了i0存储i的值,通过改变i0实现判不同的位数
代码分享:
#include<iostream> #include<string> using namespace std; int cou = 0; int main() { string num ; cin >> num; size_t n = num.size(); for (int i = 1; i <= stoi(num); i++) { int sign = 1; size_t n1 = 1;//先从个位开始 int i0 = i; while (n1 <= n) { if (i0 == 0)//所有位判断完毕 { break; } if (n1 % 2 != 0 && i0 % 2 == 0)//奇数位且非奇数 { sign = 0; break; } if (n1 % 2 == 0 || i0 % 2 != 0)//偶数位且非偶数 { sign = 0; break; } n1++; i0 /= 10; } if (sign == 1) { cou++; } } cout << cou << endl; }
链接:[蓝桥杯 2024 省 B] 好数 - 洛谷
二刷总结:
比较容易忘记更新条件,在while循环处忘记了更新n1和i0