【 csdn 算法技能树 】答案以及解析——蓝桥杯(基础)

切面条

一根高筋拉面,中间切一刀,可以得到2根面条。

如果先对折1次,中间切一刀,可以得到3根面条。

如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢?

答案及解析:

0  2

1  3

2  5

10  ?

因为是对折,容易想到和 2^{n} 有关。由归纳法知:对折10次,有 2^{n} +1 根面条。

大衍数列

中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。

它的前几项是:0、2、4、8、12、18、24、32、40、50 …

其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。

以下的代码打印出了大衍数列的前 100 项。

请填补空白处的内容。

#include <stdio.h>
int main()
{
    int i;
    for (i = 1; i <= 100; i++)
    {
        if (__________________)
            printf("%d ", i * i / 2);
        else
            printf("%d ", (i * i - 1) / 2);
    }
    printf("\n");
}

答案及解析:

判断 i 是奇数还是偶数 ,用 % 。

 


门牌制作

小蓝要为一条街的住户制作门牌号。

这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。

小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。

请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int ans = 0, x;//声明一个计数器ans,和一个整型变量x
    for (int i = 1; i <= 2020; i++)// 遍历i从1到2020,i = 2021 时跳出循环
    {
        x = i;
        while (x)//当 x=0 时,跳出循环
        {
           if(x%10 == 2)// 如果该数个位是2
            {
                ans++   //ans计数器加一
            }
           x /= 10;        //否则把数除以10,相当于把个位去掉,原来的x十位上的数 变成个位了
           ________________;
        }
    }
    cout << ans;
    return 0;
}

提示:

利用循环将当前数字的每一位求出,分别进行判断即可

答案及解析:

结合题目中的代码,进行判断


方阵转置 

问题描述

给定一个n×m矩阵相乘,求它的转置。其中1≤n≤20,1≤m≤20,矩阵中的每个元素都在整数类型(4字节)的表示范围内。

输入格式

第一行两个整数n和m;

第二行起,每行m个整数,共n行,表示n×m的矩阵。数据之间都用一个空格分隔。

输出格式

共m行,每行n个整数,数据间用一个空格分隔,表示转置后的矩阵。

样例输入

2 4
34 76 -54 7
-4 5 23 9

样例输出

34 -4
76 5
-54 23
7 9

请从以下四个选项中选择正确的代码填补空白处,实现方阵转置功能。

提示:

对一个方阵转置,就是把原来的行号变列号,原来的列号变行号
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int m, n;//n是行,m是列
    int a[20][20];
    int i, j;
    cin >> m >> n;//输入原数组行数,列数
    for (i = 0; i < m; i++)//遍历列数, i=m时跳出循环
    {
        for (j = 0; j < n; j++)//遍历行数,j=n时跳出循环
        {
            cin >> a[j][i];//把输入的数字存到原数组里去
        }
    }
    __________________;//把原来的行号变列号,原来的列号变行号
    return 0;
}

 答案及解析:


微生物增殖

假设有两种微生物 X 和 Y

X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。

一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。

现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。

如果X=10,Y=90呢?

本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

以下程序实现了这一功能,请你补全空白处内容:

提示:

分析可知,Y分别会在0.5,1.5,2.5······时被吃,所以,把60分钟分成120份
,则在除以2余数为1时,Y的数目减少X个。

#include <iostream>
using namespace std;
int main()
{
    int x = 10, y = 90;
    for (int i = 1; i <= 120; i++)
    {
        ________________;
    }
    cout << y << endl;
}

 

解析:120份,一份半分钟, Y分别会在0.5,1.5,2.5······时被吃,就是第一个半分钟被吃,第三个半分钟被吃,第五个半分钟被吃。相当于 i 从 1 到 120 ,奇数项时y被吃,问题转换成 如何判断奇数项 ,i % 2 ==1

x 三分钟加倍,就是六份半分钟。 问题转化成找 6 的倍数。即 i能被4整除。

y 两分钟加倍,就是四份半分钟。问题转化成找 4 的倍数。即i能被6整除。


成绩统计

问题描述

编写一个程序,建立了一条单向链表,每个结点包含姓名、学号、英语成绩、数学成绩和C++成绩,并通过链表操作平均最高的学生和平均分最低的学生并且输出。

输入格式

输入n+1行,第一行输入一个正整数n,表示学生数量;接下来的n行每行输入5个数据,分别表示姓名、学号、英语成绩、数学成绩和C++成绩。注意成绩有可能会有小数。

输出格式

输出两行,第一行输出平均成绩最高的学生姓名。第二行输出平均成绩最低的学生姓名。

样例输入

2
yx1 1 45 67 87
yx2 2 88 90 99

样例输出

yx2
yx1
提示: 类似冒泡法求最大值最小值
#include <bits/stdc++.h>
using namespace std;

int main()
{
    struct student  //定义结构体student
    {
        string xm;  //属性 姓名
        int xh;        //属性 学号
        double yy;        // 属性 英语
        double sx;        // 属性 数学
        double cpp;        //属性 c++
    };
    student a[1000]; //定义结构体的类型 确定用数组类型来储存数据 并且给分配足够的空间
    int n;
    double sum = 0, min = 301, max = 0;
    string mins, maxs;
    cin >> n;
    for (int i = 0; i < n; i++)//有几个人就输入几遍
    {
        cin >> a[i].xm >> a[i].xh >> a[i].yy >> a[i].sx >> a[i].cpp; 
        sum = a[i].yy + a[i].sx + a[i].cpp;                //往数组里输入数据

        __________________;//如果当前比最小的小,就把当前的值给最小。如果当前比最大的大,就把当前的值给最大。
    }
    cout << maxs << endl
         << mins;
    return 0;

星系炸弹

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

每个炸弹都可以设定多少天之后爆炸。

比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。

有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

以下程序实现了这一功能,请你填补空白处内容:

提示: json
先判断是否为闰年,这会影响2月份是28还是29,如果是闰年,2月份是29,如果不是,就是28
能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年

#include <stdio.h>

int main()
{
    int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int days = 1000;
    int year = 2014, month = 11, day = 9;
    int i;

    for (i = 0; i < days; i++) //i是天数,i = 1000 时跳出循环
    {
        day++;
        if (day > monthDays[month - 1])//如果day大于当前月的天数
        {
            day = 1; // 就把day重置为1
            month++; // 月份加一
            if (month > 12) //如果月份大于12
            {
                month = 1;  //月份重置为1
                year++;     //年数增加1
                ____________________;
            }
        }
    }

    printf("%d-%d-%d\n", year, month, day);

    getchar();
    return 0;
}

答案及解析:

 能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年


特别数的和

题目描述

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 n 中,所有这样的数的和是多少?

输入格式

共一行,包含一个整数 n。

输出格式

共一行,包含一个整数,表示满足条件的数的和。

数据范围

1≤n≤10000

输入样例:

40

输出样例:

574

以下代码实现了这一功能,请你填补空白处的内容:

提示:只要利用模除找出含有2,0,1,9的数即可

#include <iostream>

using namespace std;

int ans, n;

bool check(int n)
{
    while (n)
    {
        int tmpn = n % 10;
        if (tmpn == 2 || tmpn == 0 || tmpn == 1 || tmpn == 9)
            return true;
        ____n/=10______________;
    }
    return false;
}

int main()
{
    cin >> n;

    for (int i = 1; i <= n; i++)
    {
        if (check(i))
            ans += i;
    }

    cout << ans << endl;

    return 0;
}

答案及解析:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DFminer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值