天天快乐编程2020寒假基础班(临海)作业题解

1.5287: 游戏之我不是签到题

这个题目就是输入两个字符,是'A'和'C'或者'W'和'A',所以你需要两个字符去存储,你在判断能出现的也只能是' '(单引号)。

我们可以读入,判断第一个字符,因为他们两个不一样。是'A'就输出"WA",是'W'就输出"AC"

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a, b;
    cin >> a >> b;
    if (a == 'A')
    {
        cout << "WA\n";
    }
    else
    {
        cout << "AC\n";
    }
    return 0;
}
View Code

2.5221: 重要的话说三遍

这个题目就是让你输出三行"I'm gonna WIN!"

#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout<<"I'm gonna WIN!\n";
    cout<<"I'm gonna WIN!\n";
    cout<<"I'm gonna WIN!\n";
    return 0;
}
View Code

3.1489: C语言实验题――字符编码

读入5个char类型的字符,用原来的字母后面的第4个字母代替原来的字母就是把这个字符+4。

这个题目你的输入以及输出必须是char类型的。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    a += 4;
    b += 4;
    c += 4;
    d += 4;
    e += 4;
    cout << "password is " << a << b << c << d << e;
    return 0;
}
View Code

4.3068: 阿基米德特性

这个题目实际上是个数学题目,是不等式变换,但是不要紧我们也可以看看。

aM>b,比如2M>6,我们是不是可以试出来M=4,是不是和6/2=3有关呢。
     再试一个 5M>29,M=6,和29/5还有关吗。

是不是M>b/a(直接按照不等式的思想就是a到右边,a为正数,不变号)。

所以我们只需要解决大于(b/a)的最小整数了。

1.正好整除需要+1,2.有余数也需要+1,所以这个题目答案就是b/a+1。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a, b;
    cin >> a >> b;
    cout << b / a + 1;
    return 0;
}
View Code

5.1175: C语言实验题――时间间隔

我们可以把这个时间转换为秒,两个相减就是时间间隔t了。

(1)t怎么知道有多少小时呢,除以3600。

t怎么知道还有多少分呢,就是小时剩下的余数即%3600,之后/60。

t怎么知道还有多少秒呢,就是小时剩下的余数即%3600,再%60,得到剩下的秒。当然也可以一步到位直接%60。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int h1, m1, s1;
    char c;
    //中间还有:,要像IP地址一样用char读取掉
    cin >> h1 >> c >> m1 >> c >> s1;
    int h2, m2, s2;
    cin >> h2 >> c >> m2 >> c >> s2;
    //按照1小时是3600秒,1分钟是60秒进行转换
    int sum = (h1 * 3600 + m1 * 60 + s1) - (h2 * 3600 + m2 * 60 + s2);
    //如果时间差是负数,取正数
    if (sum < 0)
        sum = -sum;
    int h3, m3, s3;
    //得到小时数
    h3 = sum / 3600;
    //得到分钟数
    m3 = (sum % 3600) / 60;
    //得到秒数
    s3 = (sum % 3600) % 60;
    printf("%d:%02d:%02d\n", h3, m3, s3);
    return 0;
}
View Code

(2)t怎么知道有多少秒呢,可以%60,过河拆桥除以60把秒给抛弃掉。

t怎么知道还有多少分呢,可以%60,因为你已经把秒给抛弃掉了,那么你现在拿到的就是分钟数,过河拆桥除以60把分钟丢弃。

t怎么知道还有多少小时呢,过河拆桥剩下的就是。

我们常用的数字是10进制的,时间你可以理解为是60进制的数。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int h1, m1, s1;
    char c;
    //中间还有:,要像IP地址一样用char读取掉
    cin >> h1 >> c >> m1 >> c >> s1;
    int h2, m2, s2;
    cin >> h2 >> c >> m2 >> c >> s2;
    //按照1小时是3600秒,1分钟是60秒进行转换
    int sum = (h1 * 3600 + m1 * 60 + s1) - (h2 * 3600 + m2 * 60 + s2);
    //如果时间差是负数,取正数
    if (sum < 0)
        sum = -sum;
    int h3, m3, s3;
    //得到秒
    s3 = sum % 60;
    sum /= 60;
    //得到小时
    m3 = sum % 60;
    sum /= 60;
    //得到分
    h3 = sum;
    printf("%d:%02d:%02d\n", h3, m3, s3);
    return 0;
}
View Code

6.5174: 时间转换

这个题目直接告诉你时间间隔t了,让你转换一下。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int sum;
    cin >> sum;
    int h, m, s;
    //得到秒
    s = sum % 60;
    sum /= 60;
    //得到小时
    m = sum % 60;
    sum /= 60;
    //得到分
    h = sum;
    printf("%d:%d:%d", h, m, s);
    return 0;
}
View Code

7.1003: 1、2、3、4、5...

这个题目就是完整的鸡兔同笼问题了,鸡兔同笼的一般解法为。

假设笼子里全是鸡,那么脚的总只数会比实际小,少算的脚只数就是多算的兔子脚数,这个值是m-2*n。兔子数就是脚数/2,也就是(m-2*n)/2,鸡的只数就是n减去兔子的只数

会解方程的直接用解方程求解,但是我们可以算出来负数吗,我们由于进行了取整,所以最后脚数也不一定正确,需要判断。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m,n;
    while(cin>>n>>m,m||n)
    {
        int y=(m-2*n)/2;
        int x=n-y;
        //进行判断,数目不能为负且脚数需要足够
        if(x>=0&&y>=0&&2*x+4*y==m)
        {
            cout<<x<<" "<<y<<"\n"; 
        }
        else
        {
            cout<<"Error\n";
        }
    }
    return 0;
}
View Code

8.5907: 药房管理

我们可以使用一个口袋去装没有取上药品人数,取上药了药品要减少取出的药品,没取上我们统计上。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m, n;
    cin >> m >> n;
    //没有取上药品人数为num
    int num = 0;
    for (int i = 1, x; i <= n; i++)
    {
        cin >> x;
        if (x <= m)
        {
            //取上了,药品总量要减少x
            m = m - x;
        }
        else
        {
            //没有取上
            num++;
        }
    }
    cout << num <<"\n";
    return 0;
}
View Code

9.5610: 简单21点游戏 

这个题目我们可以用一个口袋去装n个数的总和,之后分好牌、较好牌和差牌进行判断。

但是要输出距离,不能出现负数。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    //牌面综合是sum
    int sum=0;
    for (int i = 0,x; i < n; i++)
    {
        cin >> x;
        sum += x;
    }
    if (sum == 21)
    {
        //21点,好牌
        cout << "Yes\n";
    }
    else if (sum >= 16 && sum <= 21)
    {
        //小于21,但离21比较近(小于等于5)是较好牌
        cout << "Just so so"<< " " << 21 - sum <<"\n";
    }
    else
    {
        //烂牌
        cout << "No"<< " ";
        //要输出距离,直接相减会得到负数,需要分情况
        if (sum > 21)
        {
            cout << sum - 21<<"\n";
        }
        else
        {
            cout << 21 - sum <<"\n";
        }
    }
    return 0;
}
View Code

10.5286: 国庆七天乐

我们需要一个袋子去装当前AC的题目数,然后按格式输出即可。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x,y;
    cin>>x>>y;
    //第一天为x题
    int num=x;
    //国庆七天,循环1到7
    for(int i=1;i<=7;i++)
    {
        //按照格式进行输出
        cout<<"10."<<i<<": AC "<<num<<"\n";
        //明天要比今天多y题
        num+=y;
    }
    return 0;
}
View Code

11.5394: 跳一跳

我们需要用一个口袋去装这次的总分,但是还有加成分,我们可以再用一个口袋去装。

有很多局,还需要记录一个最高分,所以还需要一个口袋来装最高分。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x;
    //设置最大值为0,以及当前值为0
    int ma=0,t=0;
    //设置加成分为0
    int bonus=0;
    while (cin>>x)
    {
        if(x==0)
        {
            //本次结束,最大值需要更新就更新
            if(t>ma)ma=t;
            //当前值以及加成分清空
            t=0;
            bonus=0;
        }
        else if(x==1)
        {
            //跳中,+1即可
            t++;
            //加成分清空
            bonus=0;
        }
        else
        {
            //跳中中心,使用加成分
            //加成分要比之前多2
            bonus+=2;
            //当前值需要加上加成分
            t=t+bonus;
        }
    }
    cout<<ma<<"\n";
    return 0;
}
View Code

12.1476: C语言实验题――圆周率

两边同乘上4,就是PI,所以我们可以求出右边答案。

所以看右面,分子全为1,分母就是我们要枚举1,3,5,7,9直到到4n-1。

然后第奇数项为正,偶数项为负。

把i/2也是奇偶相间的,所以就可以解决这个问题了。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    double sum = 0;
    //枚举1,3,5到(4*n-1)
    for (int i = 1; i <= (4*n-1); i+=2)
    {
        //分两种情况进行讨论
        if ((i/2)%2)
            sum -= 1.0 / i;
        else
            sum += 1.0 / i;
    }
    //输出保留五位小数
    printf("%.5f\n", sum * 4);
    return 0;
}
View Code

13.5218: 大笨钟

又来一个时间相关的题目,这个题目需要分情况进行讨论。

12:00之前(包括),都是不会Dang的,之后过正点才Dang。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int h, m;
    char c;
    //中间:需要用char去存储
    cin >> h >> c >> m;
    //12:00(包括)之前直接输出
    if (h < 12 || h == 12 && m == 0)
    {
        printf("Only %02d:%02d.  Too early to Dang.\n", h, m);
    }
    else
    {
        //超过12点要Dang(h-12)次
        h -= 12;
        //这个小时已经开始,这个小时也需要Dang
        if (m) h++;
        while (h--) cout << "Dang";
        cout << "\n";
    }
    return 0;
}
View Code

14.1093: 猴子分桃

这个题目就需要自己去思考了,而且也需要读懂题目。因为我们要能分为5堆,所以就不断*5。

但是第一次,还要多余1,所以这一次就是 1 + 5 * (sum - 1)。

然后再推回剩给老猴子的。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    while (cin >> n, n)
    {
        //先求最小需要的桃子数,超过int要使用更大的整型
        long long sum = 1;
        //每次让他正好分五堆
        for (int i = 1; i < n; i++)
            sum *= 5;
        //因为要多一个留给老猴子,所以(sum-1)有五堆,还要加上老猴子的那个
        sum = 1 + 5 * (sum - 1);
        //剩下的桃子数
        long long t = sum;
        //当前的桃子数减去分给老猴子的,分为5堆,剩下4堆
        for (int i = 1; i <= n; i++)
            t = (t - 1) / 5 * 4;
        //n次每次都会分给老猴子一个桃子,总共的需要加上
        t += n;
        cout << sum << " " << t << endl;
    }
    return 0;
}
View Code

15.1418: 复习时间

可以复习m门课,但是m是无关变量。

复习一门课的效率为100和这门课的难度差的平方,数字越小这个值越大,我们我们需要一个袋子去装最小值。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int n, m;
        cin >> n >> m;
        int ma;
        //无论如何先偷过来
        cin>>ma;
        //从1到n看看是否需要更新
        for (int i = 1,x; i < n; i++)
        {
            cin>>x;
            //比当前的难度还小,更新
            if(x<ma)ma=x;
        }
        //按照题意输出
        cout<< (100 - ma) * (100 - ma)<<"\n";
    }
    return 0;
}
View Code

16.5139: 血压

这个题目不难,读入到EOF,你给while,作为他的判断条件,他会帮你解决的。

然后我们可以用一个袋子去统计有多少个人血压正常。

之后还有两种情况让你输出,不能忘记。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while (cin >> n)
    {
        int num = 0;
        for (int i = 1,x,y; i <= n; i++)
        {
            cin >> x >> y;
            if (x >= 90 && x <= 140 && y >= 60 && y <= 90)
            {
                num++;
            }
        }
        cout << num << endl;
        if (num == n)
        {
            //所有人血压都正常
            cout << "Perfect\n";
        }
        if (num == 0)
        {
            //所有人血压都不正常
            cout << "Terrible\n";
        }
    }
    return 0;
}
View Code

17.1478: C语言实验题――打印金字塔

课堂上打印图形的一个相似题目,我们仍需要分情况来看。

比如样例,第1行有4个空格,第2行有2个空格,第3行有0个空格,第i行有(n-i)*2个空格。

之后正着输出一次,倒着输出一次。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        //输出(n-i)*2个空格
        for (int j = 0; j < (n - i)*2; j++)
            cout << " ";
        //正着输出
        for (int j = 1; j <= i; j++)
        {
            //1前面没有空格
            if (j!=1)cout << " ";
            cout << j;
        }
        //倒着输出
        for (int j = i-1; j >=1; j--)
            cout << " " << j;
        cout << endl;
    }
    return 0;
}
View Code

18.4982: 打印正方形 

这个题目还是需要找规律,但是规律并不方便找出来,我们可以单独对第一行和最后一行处理。

如果要找规律是这样的,第一行、第一列、第m行第n列不是空格。

正方形四个顶点是'+',第一行最后一行的是'-',其他是'|'。

这个不仅要找规律,还要很好的控制自己的代码。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        //行数只有列数的一半+1
        int m = n / 2 + 1;
        //循环每一行
        for (int i = 1; i <= m; i++)
        {
            //循环每一列
            for (int j = 1; j <= n; j++)
            {
                //满足四种情况,不是空格
                if (i == 1 || j == 1 || i == m | j == n)
                {
                    //如果是四个顶点输出'+'
                    if ( i == 1 && j == 1  || i == 1 && j == n|| i == m && j == 1 || i == m && j == n)
                        cout << "+";
                    else if (i == 1 || i == m)
                        cout << "-";
                    else
                        cout << "|";
                }
                else
                    cout << " ";
            }
            cout << "\n";
        }
    }
    return 0;
}
View Code

 

posted @ 2020-02-11 23:41  暴力都不会的蒟蒻  阅读(422)  评论(0编辑  收藏  举报