题目大意
小朋友在玩报数游戏,从 1 开始报数,除了报到 3 的倍数或含有 3 的数字 时,每次报数都需要鼓掌一次。 指定一个整数n,假设报数到n时,结束游戏,小朋友们需要鼓掌多少次呢?
算法分析
给定一个有序递增序列,求出其中为 3的倍数 或 十进制表示法上含有3 的数的总数。
知识点分析
- 求余运算
- 数位分离
- 一维数组
代码分析
本题有两个关键点(即上述所言的一、二点),我们可以尝试将其判断方法写入一个函数,之后加一个循环依次枚举1~n之间符合条件的书数 之后统计输出即可,下面我着重讲判断函数。
1.三的倍数的求法
这个太简单了,基础中的基础:
if(n%3==0) return 1;
2.十进制表示法上含有3的求法
本质上是数位分离,只要在分离出三时返回1即可。
do {
int r = k % 10; //取出个位
if (r == 3) //判断是否是3
return 1; //如果是,说明该数符合条件,返回1
//否则,继续循环分离个位
k /= 10; //当前位已被分离,除以10后继续分离下一位
} while (k != 0); //直到该数分离完毕
return 0; //若分离完后仍未符合条件,返回0
//当然,还有一种用字符串的方法,不过这题的规模没必要
3.完整函数
bool pd(int k) {
if (k % 3 == 0)
return 1;
//注意,这里不要加"else return 0;",因为该数不能被三整除不代表不含三
//两个核心思路的判断方法可以互换顺序,只要注意上面说的就行了
do {
int r = k % 10;
if (r == 3)
return 1;
k /= 10;
} while (k != 0);
return 0;
}
完整代码
我都写到这了你还不会,可别怪我嘲讽你,况且我也不想你或我被封号。
最后注意输出时要把总数字减去统计出来的数字。