7-31 逢7击掌
题目描述:
一群人围坐成一圈玩报数的游戏。
游戏规则是:从1开始报数,若遇到7的倍数或者个位为7的数则击掌代替,若犯错则要受罚。
可是这些人都太聪明了,竟然没人犯错!
请问同样聪明的你,现在当报数到 n 时,击掌共次数 c 是多少?
输入格式:
21
输出格式:
4
错误代码示范:
#include<stdio.h>
int main()
{
int a,c=0;
scanf("%d",&a);
for(int b=1;b<=a;b++)
{
if(b%10==7 || b%7==0)
{
c++;
}
}
printf("%d",c);
}
得到结果会是:

原因分析:
因为该题目并没有限制输入数字多少,当输入的数字过于庞大,无法在要求的时间内得到相应结果,换句话说就是算法过于复杂,导致程序运行超时。要达到正确答案,必须要有简化算法。
原理分析:
题目要求统计个位数是7或者被7整除的数字,那么可以得到以下规律,以70为一个周期,就会有16个满足题意,如果无法被70整除的数字,在将其余数,来穷举判断是否满足要求。
正确代码:
#include<stdio.h>
int main()
{
int n,cnt=0;
int sum=0;
scanf("%d",&n);
if(n>=70)//判断n是否大于70,如果大于70,就将其在
{
sum=n/70*16;//以70为周期,计算相应的个数。
cnt+=sum;
}
for(int i=1;i<=n%70;i++)//计算剩下n%70的数字中,是否满足题意
{
if(i%7==0||i%10==7)
{
cnt++;
}
}
printf("%d",cnt);//输出满足题意的个数
return 0;
}

总结:
当一个程序运行超时时,应考虑自己算法是否满足,不满足,找出其中规律缩短程序运行时间,简化算法。

5104

被折叠的 条评论
为什么被折叠?



