2016-2017中国石油大学期末考前热身

2016-2017学年第一学期《计算机程序设计C(2-1)》考前热身赛

贵有恒,何必三更起五更眠;

最无益,莫过一日曝十日寒。

问题 A: 小明会挨批评吗?

【题目描述】

小明是个很乖的小朋友,她知道爸爸工作很辛苦,晚上回来还会检查自己的学习成绩。如果自己的成绩低于75分,那么她就难逃被爸爸批评的厄运。但是有一种情况例外,小明晚上睡觉的时间是22点30分(用一个四位数2230表示),如果爸爸回到家的时间(也用一个四位数表示)超过22点30分(即这个四位数大于2230),那么无论她的成绩是多少,她都不会听到爸爸的批评了,毕竟人家已经睡觉了嘛!

现在请你写一个程序,根据输入的小明成绩、爸爸到家时间,来判断小明是否会遭到爸爸的批评!

【输入】

输入数据,包括两个整数,依次表示小明的成绩,和爸爸到家的时间。

【输出】

输出BAD或者OK,表示小明会被批评或者不会被批评。

【样例输入】

50 2300

【样例输出】

OK

【参考代码】


#include <stdio.h>

int main(int argc, const char * argv[])
{
        int a,b;
        scanf("%d%d",&a,&b);
        
        if(b>2230)
            printf("OK");
        else if (a>=75)
            printf("OK");
        else
            printf("BAD");
        
        return 0;
    }

问题 B: 小明买文具

【题目描述】

班主任给小明一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是1元9角,而班主任给小明的钱是a元b角,小明想知道,她最多能买多少只签字笔呢。

【输入】

输入的数据,在一行内,包括两个整数,依次表示a和b。

【输出】

输出一个整数,表示小明最多能买多少只签字笔。

【样例输入】

10 3

【样例输出】

5

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    
    int c;
    c=a*10+b;
    
    printf("%d",c/19);
    
    return 0;
}

问题 C: 小明买童鞋

【题目描述】

妈妈带着小明去购物,小明可开心啦。她知道自己的鞋码是33号,可是当她看到很多漂亮的鞋子,她做了一个贪心的决定:33、34号的鞋都买了!毕竟自己还会再长高嘛!现在营业员告诉她,这里有n双鞋,并且依次报出了每双鞋的鞋码。小明很想知道,自己能买下多少双鞋呢!请你编程解决这个问题。

【输入】

第一行1个整数n,表示有多少双鞋。

第二行n个整数,依次表示每双鞋的鞋码。

【输出】

输出一个整数,表示小玉能买下多少双鞋。

【样例输入】

7
33 40 33 35 37 36 34

【样例输出】

3

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[100],n,i;
    int count=0;
    
    scanf("%d",&n);
    
    for (i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    
    for (i=0; i<n; i++)
    {
        if (a[i]==33||a[i]==34)
            count++;
    }
    
    printf("%d",count);
    
    return 0;
}

问题 D: 小明的零花钱

【题目描述】

小明的爸爸可不只会批评,其实也很心疼小明的。为了鼓励小明更好的学习,爸爸制定了具有小明家庭特色的市场经济政策。那就是:把小明历次的成绩列成一排数字来看,小明每累计3次成绩达到90分或者以上,就给小明零花钱,给的数额为3次成绩的总分-260。小明正在欢呼,严厉的爸爸马上补充到:每次成绩只算1次,如果有一次成绩不及格(小于60分),马上终止有奖统计(即接下来的成绩都无效),零花钱也就此不再发放。小明想知道,以她的历次成绩,能领到多少的零花钱呢。注意:数据中至少会出现一次不及格的情况。请你编程解决这个问题。

【输入】

输入的成绩为一行整数,个数并不确定。

【输出】

输出一个整数,表示小明能领到多少零花钱。

【样例输入】

80 90 70 92 94 60 92 91 76 96 93 90 58 90 100 90

【样例输出】

35

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {

    int a[100],i;
    
    while(scanf("%d",&a[i])!=EOF)
        i++;

    int n;
    n=i-1;
    
    for (i=0; i<n; i++)
        if (a[i]<60)
            n=i;

    int b[80],j=0;
    
    for (i=0; i<n; i++) 
        if (a[i]>=90)
            b[j]=a[i],j++;
    
    j=j-j%3;
    int t=j/3;
    
    
    int sum=0;
    for (int k=0; k<j; k++)
        sum+=b[k];
    
    printf("%d",sum-260*t);
    
    return 0;
}

【参考代码(王铜)】

#include<stdio.h>
int main()
{
    int score,add = 0,i = 0,money = 0;
    scanf("%d", &score);
    
    while (score>=60)
    {
        if (score >= 90)
        {
            add += score;
            i++;
        }
        
        if (i == 3)
        {
            money += (add - 260);
            i = 0;
            add = 0;
        }

        scanf("%d", &score);
    }
    
    printf("%d\n", money);
}

问题 E: 小明的安家计划

【题目描述】

小明化身一条小鱼,到达了一个新的海域,它要感受下水温如何,如果水温低于15度,它会觉得太冷了(输出‘cold’),如果水温高于25度,它会觉得太热了(输出‘hot’),只有水温在15度和25度之间(包含15度、25度),小明才会觉得这是一个可以安家的地方(输出’home’)。

【输入】

输入一个实数,表示水温。

【输出】

输出相应的英文单词,表示小明的感受是什么。

【样例输入】

20.8

【样例输出】

home

【参考代码】


#include <stdio.h>

int main(int argc, const char * argv[]) {
    double t;
    scanf("%lf",&t);
    
    if (t<15) 
        printf("cold"); 
    else if (t>25)
        printf("hot");
    else
        printf("home");
    
    return 0;
}

问题 F: 小明在游泳

【题目描述】

小明开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小明第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%。现在小明想知道,如果要游到距离x米的地方,她需要游多少步呢。请你编程解决这个问题。

【输入】

输入一个数字(不一定是整数),表示要游的目标距离。

【输出】

输出一个整数,表示小明一共需要游多少步。

【样例输入】

4.3

【样例输出】

3

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    double n,t=2,sum=0;
    scanf("%lf",&n);
    
    int i=1;
    while (sum<=n)
    {
        sum+=t;
        t*=0.98;
        i++;
    }
    
    printf("%d",i-1);
    
    return 0;
}

问题 G: 小明的航程

【题目描述】

有一条小鱼叫小明,它上午游泳150公里,下午游泳100公里,晚上休息,每天都是如此,请问这样过了n天以后,一共累计游泳了多少公里呢?

【输入】

输入一个整数,表示n天。

【输出】

输出一个整数,表示小明累计游泳了多少公里。

【样例输入】

4

【样例输出】

1000

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    printf("%d",250*n);
    return 0;
}

问题 H: 小明的游泳时间

【题目描述】

里约热内卢奥运会要到了,小明在拼命练习游泳准备参加游泳比赛,可怜的小明并不知道鱼类是不能参加人类的奥运会的。这一天,小明给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从a时b分一直游泳到当天的c时d分,请你帮小明计算一下,它这天一共游了多少时间呢?小明游的好辛苦呀,你可不要算错了哦。

【输入】

一行内输入4个整数,分别表示a,b,c,d。

【输出】

一行内输出2个整数e和f,用空格间隔,依次表示小明这天一共游了多少小时多少分钟。其中表示分钟的整数f应该小于60。

【样例输入】

12 50 19 55

【样例输出】

7 5

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b,c,d;
    int a1,b1,c1,d1,e;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    
    a1=60*a+b;
    b1=60*c+d;
    
    e=b1-a1;
    c1=e/60;
    d1=e%60;
    
    printf("%d %d",c1,d1);
    return 0;
}

问题 I: 小明也会感冒咳嗽

【题目描述】

还是那条叫小明的小鱼。它要游经n(n>=2)个水域,感受到了每个水域的温度,如果相邻经过的两个水域的温度差达到10或者10以上,小明就会受不了要咳嗽1次。如果出现连续咳嗽2次或者2次以上的情况,小明就处于感冒的状态。当然小明也具有一定的免疫力,只要到达下一个水域时没有咳嗽,小明的感冒马上就好了。请你计算小明总共经历了几次咳嗽、几次感冒?

【输入】

第一行输入一个整数,表示n。

第二行输入n个整数,用空格间隔,依次表示n个水域的温度。

【输出】

一行内输出两个整数,用空格间隔,依次表示累计下来咳嗽几次、感冒几次。

【样例输入】

7
10 11 22 10 30 25 60

【样例输出】

4 1

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {

    int a,x=0,y=0,z=0,i;
    scanf("%d",&a);
    
    int n[a+1];
    
    for(i=0;i<a;i++)
    {
        scanf("%d",&n[i]);
    }
    
    for(i=1;i<a;i++) 
    { 
        if(n[i]-n[i-1]>=10||n[i]-n[i-1]<=-10)
        {
            z++;
            x++;
        }   
        else z=0;
        
        if (z==2)
            y++;
    }
    
    printf("%d %d",x,y);      
    return 0;
}

问题 J: 小明遇见怪兽

【题目描述】

林子大了,什么鸟都有,海里深了,再奇怪的东西也都存在。某天小明就遇到了这样一群奇怪的鱼,他们有的有不只一个头,有的不只一个尾巴,这哪里算的上是鱼,这分明就是一群可怕的怪兽!小明在极度的惊吓中,仍然用颤抖的鱼鳍数了数,一共有A、B、C三类怪兽(每类怪兽都至少存在一只,每类怪兽的数目一定都是整数),每只A类怪兽有3个头,每只B类怪兽有4个头,每只C类怪兽有5个头,每只A类怪兽有1个尾巴,每只B类怪兽有2个尾巴,每只C类怪兽有4个尾巴,这实在是太可怕了!还没完,小明胆子越来越大,又数下了这群怪兽一共有m个头,n个尾巴,以及A类怪兽的数目是x,然后小明就实在受不了游回家去了。回到家之后,好奇的小明又突然想知道,B类怪兽和C类怪兽的数目分别是多少呢?请你帮忙计算一下。当然还有一种情况是小明在惊吓之中数错了,如果是这样你应该输出”No Answer”。

【输入】

一行内输入三个整数,用空格间隔,依次表示x,m,n。

【输出】

一行内输出两个整数,用空格间隔,依次表示B类和C类怪兽的数目;或者在一行内输出”No Answer”,表示B类和C类怪兽数目无法计算,小明数错了。

【样例输入】

3 75 51

【样例输出】

4 10

【参考代码】

(因为题目要求是输出整数解,所以我采用遍历的方法来试根。)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    int a,b,c;
    int h,f;
    scanf("%d%d%d",&a,&h,&f);
    
    for (b=0; b<=h/4; b++)
        for (c=0; c<=h/5; c++)
        {
            if (3*a+4*b+5*c==h&&a+2*b+4*c==f)
            {
                printf("%d %d",b,c);
                exit(0);
            }
            
        }
    
    printf("No Answer");
    return 0;
}

【参考代码(杨建涛)】

(解方程的话面临的问题就是有解和有整数解的问题,由数学知识知,整数的加减乘闭合运算得到的一定是整数,所以我们只需要对除法的时候能否整除进行判断,便可以轻易的控制其根是否为整数根,详情参考代码。)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x,m,n;
    int a,b;
    scanf("%d%d%d",&x,&m,&n);
    
    b=(2*n-m+x)%3;
    a=(4*m-7*x-5*n)%6;
    
    if(a==0&&b==0)
        printf("%d %d\n",(4*m-7*x-5*n)/6,(2*n-m+x)/3);
    else
        printf("No Answer\n");
    
    return 0;
}

问题 K: 小明的蜡烛

【题目描述】

小明喜欢浪漫,她想用蜡烛点亮房间。现在他有a根蜡烛,每根蜡烛可以点亮1分钟。然而她可以将b根用完的蜡烛搓成一根新的蜡烛。现在她想知道,她手上的蜡烛能燃烧多少分钟呢?

【输入】

一行包括两个数字,分别为a与b(1<=a<=1000,1<b<=1000)

【输出】

输出包括一个数字,为蜡烛能点亮的时间。

【样例输入】

4 2

【样例输出】

7

【参考代码】

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a,b;
    scanf("%d%d",&a,&b);
    
    int count=0,time=0;
    while (a>=1)
    {
        a--;
        count++;
        time++;
        if(count%b==0)
            a++,count=0;
    }
    
    printf("%d",time);
    
    return 0;
}

 

分享