csp练题记录(C语言,编译器dev c++)201912-1报数
一、题目描述
二、思路分析
这道题思路很明显,找出7的倍数和含有数字7的情况。要注意的是题目描述中说的跳过的不计入。我们可以构造一个函数对本次应报的数进行是否跳过的判断,也可以不构造函数直接在main函数里实现这一判断功能。
三、代码
用函数进行判断的:
#include<stdio.h>
int main()
{
bool judge(int x);
int n,i,data[4]={0};
scanf("%d",&n);
int count=0;
for(i=1;count<n;i++)
{
if(judge(i))
{
data[(i-1)%4]++;
}
else
{
count++;
}
}
for(i=0;i<4;i++)//输出跳过次数
{
printf("%d\n",data[i]);
}
return 0;
}
bool judge(int x)
{
int t=x;
if(x%7==0)
{
return 1;
}
else
{
while(t>=1)
{
if(t%10==7)
{
return 1;
}
t=t/10;
}
return 0;
}
}
在主函数进行判断的:
#include<stdio.h>
int main()
{
int n,man[4]={0};//被跳过的数字不计入
scanf("%d",&n);
int i,q,t,s=0,flag=0;
for(i=0;i<n;i++)
{
s++;
t=s;
while(t>=1)
{
if((t%10)==7)//含有7
{
flag++;
break;
}
t=t/10;
}
if(s%7==0)
{
flag++;
}
if(flag>0)//有跳过情况
{
man[(s-1)%4]++;
i--;
}
flag=0;
}
for(i=0;i<4;i++)//输出跳过次数
{
printf("%d\n",man[i]);
}
return 0;
}
四、反思
这道题并不难,但我开始一直只得了50分,看、问了dalao,明确了我的解题思路没毛病,却还是找不到症结所在,慢慢琢磨才想明白了,期间犯了俩白痴型错误如下:
//跳过情况判断在主函数里
while(t>=1)
{
if(t%7==0)//此处将7的倍数判断放在了while循环里,t每循环一次都右移一位,
//例如14X,这十个数好多都不应该跳过,但循环一次变成了14,造成了虚假统计
{
flag++;
break;
}
if((t%10)==7)//含有7
{
flag++;
break;
}
t=t/10;
}
bool judge(int x)
{
int t=x;
if(x%7==0)
{
return 1;
}
else
{
while(t>=1)
{
t=x%10;//回头看这个错误犯的属实傻X,无语凝噎。。。
if(t==7)
{
return 1;
}
t=t/10;
}
return 0;
}
}
解题思路有了,但到代码实现的时候,会有很多小细节要注意,尤其是循环体那块,语句的位置不当会造成严重后果,自己还觉得思路对了,为什么就是出不来正确结果,排查真的很难发现…