题目描述:
一群人围坐成一圈玩报数的游戏。
游戏规则是:从1开始报数,若遇到7的倍数或者个位为7的数则击掌代替,若犯错则要受罚。
可是这些人都太聪明了,竟然没人犯错!
请问同样聪明的你,现在当报数到 n 时,击掌共次数 c 是多少?
输入输出:
输入 | 输出 |
21 | 4 |
1000000 | 228571 |
#include<stdio.h>
int main()
{int n,cnt=0;int sum=0;scanf("%d",&n);if(n>=70)//以70为一周期简化算法
{sum=n/70*16;cnt+=sum;
} for(int i=1;i<=n%70;i++)
{if(i%7==0||i%10==7)//取余并求出剩余数中符合条件的个数
{cnt++;
}
}printf("%d",cnt);return 0;
}
思路:直接一个一个判断固然可行,但在范围极大时运算时间过长,因此简化算法。
一直以70为以周期其中符合条件的数有16个,于是可以求出周期的个数,再求出余数中符合条件的个数,相加得出。