专栏首页奔跑的键盘侠C语言——小学四年级题目解析(二)

C语言——小学四年级题目解析(二)

这是奔跑的键盘侠的第148篇文章

作者|我是奔跑的键盘侠

来源|奔跑的键盘侠(ID:runningkeyboardhero)

转载请联系授权(微信ID:ctwott)

搬砖继续……

年级只是代表题型,难度不做区分。规则:

一年级:选择题;

二年级:填空题;

三年级:阅读题;

四年级: 编程题。

第2题

乍一看,就是一道小学数学题,一个经典的解题思路:吹个口哨,所有的小动物抬起2只脚,总共会抬起92*2=184只脚,剩下358-184=174只脚,鸡两只脚都抬起来就起飞了,所以这174只脚都是兔纸的,兔纸数量=174/2=87只,鸡的数量92-87=5只

后来有了x,y和方程式。这就成了一道初中的方程求解题目。

x+y=92

2x+4y=358

easy!

再后来,学了C语言,又成了一道费解的编程题,内牛满面

对计算机来讲,他不会吹口哨让小动物抬脚,直接摆2个方程求解更是不会。

你必须要告诉它算法,而它才会按部就班的给你答案。

网上搜罗一下,真有人直接x=(358-2*92)/2列出来,我竟无言以对。

这道题目显然是要考察循环结构的应用,如while,for等都可以。

最傻瓜式的算法,可以2层for循环,x,y均从0开始循环至92,然后同时满足上面的2个方程式,就是答案了。需要加个标志,方程式成立时,2次break跳出循环。

稍微简化一下,用一层循环,只循环x,从0开始循环至92,那y=92-x,只须满足2x+4y=358即可,1次break直接结束。

代码如下:

#include <stdio.h>
int main()
{
  int x,y;/*x代表鸡的数量,y代表兔的数量*/
  for(x=0;x<=92;x++){
    y=92-x;
    if(4*y + 2*x ==358){
      printf("鸡的数量是%d只,兔的数量是%d只。\n",x,y);
      break;
      }
    }
  if(x==93){
    printf("No answer!");
  }
  return 0;
}

==========编译成功后开始运行==========

"C:\Users\2019_943_37.exe"

Process started (PID=3680) >>>

鸡的数量是5只,兔的数量是87只。

<<< Process finished (PID=3680). (Exit code 0)

================ READY ================

末尾又加了一个x==93的判断,也就是x循环到92依旧没有答案、无解时,会提示No answer! 这道题显然是有答案的,所以这道题目有没这句话无影响。但是作为编程习惯的养成,建议要增加一些边界的设计逻辑。

第3题

这道题让初学C语言的我感觉到了一丝压力,构造整形数组?按照卷面综合难度来看,不应该有高难度的考察点。

C99往后的版本,支持定义的数组长度可以是变量,所以可以先让用户输入数组长度,然后输入数组元素。

另外根据题意,数组a和数组b不能有0,也就是说不能纯粹的定义一个100长度的数组a,b,必须长度跟正负数个数相等才对。

如果是旧版本,就需要用malloc定义空间长度了,头大

于是我就先写了个简单易懂版的代码,虽说简单易懂,其实我也是思考了大半天才写出来。细节考虑比较复杂,比如万一没有正数或者没负数,按稍微规范一点的格式写了56行……

#include <stdio.h>

int main()
{
    int num;
    printf("请输入数组元素个数(须在1-100之间):\n");
    scanf("%d",&num);
    int str[num];
    int i;
    int cnt1=0;
    int cnt2=0;
    printf("请输入数组的%d个整数值\n",num);
    for(i=0;i<num;i++){
        scanf("%d",&str[i]);
        if(str[i]>0){
            cnt1++;
        }else if(str[i]<0){
            cnt2++;
        }
    }
    int a[cnt1];
    int b[cnt2];
    int j=0,k=0;
    int max=0,min=0;
    if(cnt1){
        printf("数组a的元素有:\n");
        for(i=0;i<num;i++){
            if(str[i]>0){
                a[j]=str[i];
                printf("%d\t",a[j]);
                if(a[j]>max){
                    max=a[j];
                }
                j++;
            }
        }
        printf("\n数组a的最大值为%d\n",max );
    }else printf("输入的数组元素中无正整数,数组a不存在。\n");

    if(cnt2){
        printf("数组b的元素有:\n");
        for(i=0;i<num;i++){
            if(str[i]<0){
                b[k]=str[i];
                printf("%d\t",b[k]);
                if(b[k]<min){
                    min=b[k];
                }
                k++;
            }
        }
        printf("\n数组b的最小值为%d\n",min );
    }else printf("输入的数组元素中无负整数,数组b不存在。\n");

  return 0;
}

内容太多,过于详实,可能也并不是什么特别好的事情,毕竟这不是实战。于是精简了一下,37行代码,不考虑无正数负数的情形,能省去大括号的就省去。

#include <stdio.h>

int main()
{
    int num;
    printf("请输入数组元素个数(须在1-100之间):\n");
    scanf("%d",&num);
    int str[num];
    int i;
    int cnt1=0,cnt2=0;
    printf("请输入数组的%d个整数值\n",num);
    for(i=0;i<num;i++){
        scanf("%d",&str[i]);
        if(str[i]>0) cnt1++;
        else if(str[i]<0) cnt2++;
    }

    int a[cnt1],b[cnt2];
    int j=0,k=0;
    int max=0,min=0;
    for(i=0;i<num;i++){
        if(str[i]>0){
            a[j]=str[i];
            if(a[j]>max) max=a[j];
            j++;
        }else if(str[i]<0){
            b[k]=str[i];
            if(b[k]<min) min=b[k];
            k++;
        }
    }
    for(i=0;i<cnt1;i++) printf("a[%d]=%d\n",i,a[i]);
    printf("数组a的最大值为%d\n",max);
    for(i=0;i<cnt2;i++) printf("b[%d]=%d\n",i,b[i]);
    printf("数组b的最小值为%d\n",min);
  return 0;
}

稍微改了一下输出形式,编译运行结果如下:

另外,题目让我们构造一个数组x,应该把str[num]改成x[num]才合乎题意,这里偷懒一下就不改了。

最后的最后,这题用指针和malloc可能会有更犀利的代码,回头如果有时间再说。

-END-

© Copyright

奔跑的键盘侠原创作品 | 尽情分享朋友圈 | 转载请联系授权

本文分享自微信公众号 - 奔跑的键盘侠(runningkeyboardhero),作者:我是奔跑的键盘侠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 按键精灵——数组的应用(二)

    数组的应用,上一期讲了Array、UBound、LBound,这期我们继续将另外两个函数,Split函数和Filter函数。

    Ed_Frey
  • c++ 杨辉三角

    前几天刚入c++,感觉很多python的东西遮住了视线,就好比第一章后面几节有个题目,杨辉三角。用惯了python的列表,然后c++是数组,怎么用就有点懵逼,p...

    Ed_Frey
  • Python——关于path的坑

    学习语言,基本都会碰到关于路径拼接的语法,对于业余选手来讲,可能会比较困惑,包括我在内,直到某一天才顿悟…… 雷爆了。。

    Ed_Frey
  • Elasticsearch Mapping是啥?

    我们知道,es如果对应数据表,表中的数据是不是有数据类型,那么es的mapping就是来设置这个字段类型的。它的主要作用:

    憧憬博客
  • Java工程师:非科班自学Java是如何获得校招offer的

    背景介绍 楼主某末流985渣硕一枚,磕盐不会,偶然接触了下编程,然后又稍微学了学Java,后面就走上了程序猿的道路,今年四月侥幸去菊厂实习了一波(虽然没学到东...

    牛客网
  • 【Java面经】非科班渣硕面经

    楼主某末流985渣硕一枚,磕盐不会,偶然接触了下编程,然后又稍微学了学Java,后面就走上了程序猿的道路,今年四月侥幸去菊厂实习了一波(虽然没学到东西)。

    牛客网
  • 在不被spring容器管理的类中使用ApplicationContext应用上下文bean

    在我们做项目的时候,经常能遇到不被spring管理的类中要使用相关spring bean,比如自定义过滤器,静态工具类等,相应的也有几种办法,一种是想办法使不被...

    用户1637228
  • 【蓝桥杯系列】第一节 C的基本用法

    置顶编程范收获更多热门编程快讯 大家好,最近很多小伙伴向我反应小编!我参加了蓝桥杯但是我连那是什么都不知道,我该怎么训练?是不是在网站刷题就可以啊? 在这里我要...

    编程范 源代码公司
  • 从春招到秋招,算法工程师养成记(阿里+腾讯+其他)

    自我介绍 大家好,我是老班长,一名老牛油(至于多老呢?我基本是第一批关注牛客网的同学,我加牛客网qq1群的时候,群里只有400多人(现在估计10多个群了吧),那...

    牛客网
  • C数据输出printf("%+-6d%+-6d",a,b);

    复杂点的%6d是一共6位,不足的用空格补足。但是题目这么长的还没见过。其实这个题目并不复杂。

    用户6755376

扫码关注云+社区

领取腾讯云代金券