ACM基础题解析(来自内工大安老师)

  • 7-1 输出华氏-摄氏温度转换表 思路:
    输入温度的下限和上限
    判断是否符合条件
    如果不符合,则直接输出"Invalid."
    如果符合,则按温度从低到高,每两个华氏度为一个步长,计算摄氏度,并输出

  • 7-2 统计学生平均成绩与及格人数 思路:
    用一个整型数组保存学生成绩。数组长度适当地大一点儿,避免不够用。
    按要求,依次输入人数、成绩。先计算总和,再计算平均成绩与统计及格人数。输出。

    注意:输入人数后,需要判断人数是否为0,如果为0,则直接输出平均成绩与人数都是0;如果人数不为0,才进行相应计算。
    计算平均成绩时,注意数据类型问题。

  • 7-3 水仙花数
       这个题的想法似乎很简单,输入N,按公式依次找出N位数中所有的水仙花数即可。但是,如果按这个思路来走,往往超时。
    特别是当N=7时,计算7个数的7次方,并相加起来,运算量很大。
       另外,好多同学用pow()函数来求幂,其实在这种情况下是不可取的。因为pow()函数的结果值是double型的,并不精确,可能会影响判断。
       这时需要换一种思路。用空间换时间,即提前把各个数字的N次方算出来,存放至数组中,在找水仙花数的时候就不用再进行大量的计算了。
       比如,用int p[10];这个数组依次存放0-9这十个数的N次方,提前就算好后,保存进去。
       然后,再对所有的N位数,进行水仙花数的判断,就可大大减少运算量。

    参考算法:
    1、输入N。
    2、计算N位数的最小值start和最大值end,比如,当N=4时,start是1000,end是9999。
    3、计算并填充数组p。
    4、将start至end之间的所有数m拿来算一遍,看m的每位数字的N次方之和是否等于m,此时会利用到数组p。如果是则输出。

  • 7-4 找出不是两个数组共有的元素
       假设两个数组分别为a和b。再引入一个过渡的数组c。
       编写函数minu(int a[], int b[], int c[]),实现如下功能:
       1、对于a中的每一个元素x,都要判断一下它是否在b中出现过。
       2、如果x在b中出现过,则处理完毕,再接着处理a中的下一个元素。
       3、如果x未在b中出现过,则将x加入数组c中,在加入时要保证c中当前元素不包含x,否则就不再加入x。

       然后依次调用minu函数两次:
       minu(a, b, c);
       minu(b, a, c);
       之后,c中元素即为所要找的不是两个数组共有的元素。输出c即可。

    注意:1、a、b、c数组中当前有效元素个数。
         2、如何判断一个数组中是否包含某个元素。

  • 7-5 字符串转换成十进制整数
       定义保存计算结果的变量r,并初始化为0。
       首先将字符串读入,以'#'结束。
       将字符串的每一个字符,执行以下操作: 
        1)如果是第一个字符,要判断一下是否是'-',如果是,则表示这是一个负数,要记录下来 。
        2)对于每一个字符,判断是否在‘0’-‘9’、‘a'-'f'、'A'-'F'的范围之内,如果不在 此范围内,就略去不操作。否则,就将该字符对应的十进制数x算出来,并累加到r内。即r = r *  16 + x;
        计算结束后,如果是负数,就将r取乘以-1,输出r。

  • 7-6 说反话-加强版
       用到一个函数strtok(),可以简化操作。
       strtok的作用,大家可以查一下,大致是将一个字符串用某种分隔符隔成一系列的子串。
       思路:
       定义一个字符串str和一个字符串数组res。
       将最初的一句英文读入str中。
       通过strtok将str中的内容解析为一系列的单词,并依次存入res中。
       再将res中的元素依次逆序输出。即先输出最后一个元素,再输出倒数第二个元素,直到第一 个元素。
       
       注意:单词间用一个空格分隔。即最后输出的一个单词后面不再有空格。

  • 7-7 九宫格输入法
       同样用到了strtok函数。
       先将按键序列输入后保存在字符串str中。
       用strtok将str解析为一系列的按键组合。
       对于每一个按键组合,求出其中包含的字符key,计算其字符串长度rep,这个长度代表了同一个键的按键次数。
       再根据key和rep决定该按键组合代表的键值。输出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值