csp练题记录(C语言,编译器dev c++)201912-1报数

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;
 }
 }

解题思路有了,但到代码实现的时候,会有很多小细节要注意,尤其是循环体那块,语句的位置不当会造成严重后果,自己还觉得思路对了,为什么就是出不来正确结果,排查真的很难发现…

发布了4 篇原创文章 · 获赞 2 · 访问量 218

猜你喜欢

转载自blog.csdn.net/z_2_0_/article/details/104092629
今日推荐