C++零基础入门教程 #5运用编程解决实际问题

前言

学那么多东西,那这些有啥用呢? 很遗憾,没啥用

实际上,有很多问题是可以通过我们这些天学习的内容来实现的。

首先,在这里推荐一些做题的平台:

洛谷(推荐新手使用)

这些平台的好处在于,写完题目后,我们可以将代码提交到网站上测评,

帮助测试出算法中的问题并加以巩固。

同时,做不出题目时,可以看一看题解,学习会更方便。

1.  A + B Problem

题目传送门:  P1001 A+B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目比较简单,输入A和B,要求输出A+B。

但是,作为一个合格的OIer,审清题目很重要。

做题时,读完题面,先看数据范围,避免数据溢出。这题的数据是

-10^9 <= a, b <= 10^9   (一般来说,a ^ b表示a的b次方)

那没事了,因为int类型的储存上限大约是±( 2 * 10 ^ 9 ),没有溢出。

那我们就可以大胆写题了:

#include<iostream>
using namespace std;
int a, b;
int main()
{
    cin >> a >> b;
    cout << a + b << endl;
    return 0;
}

需要注意,在定义变量时,一般定为全局变量,即在main()外边。

这样做有两点好处:一是变量会自动初始化为0,二是需要比较大的数组时,main函数里边的空间可能会不够,导致程序错误。

顺带提一句,输出时作者习惯加换行,调试时更加清晰,同时洛谷的评测机会忽略末尾的换行,也就是这样做对评测结果没有影响。

写好代码后,记得先在本地的dev-c++上运行一遍,确认答案正确,接下来就是提交了。

那么我们在洛谷上做的第一道题目就完成啦~现在回到题目,点击提交答案,把代码粘贴进去吧~(什么?你说没账号?注册一个呗!以后我们的做题都会在洛谷上进行,没账号怎么学)

2.查找特定的值 

题目传送门:B2093 查找特定的值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

看到这个题目,是不是就想到了数组?没错,这道题的思路很清晰:

老样子,先看数据范围:n <= 10000。莫慌,正常情况下,题目的限时是1s(即程序必须在1s内输出结果,否则算作超时),而计算机1秒能进行大约1亿次运算,完全不慌。

首先创建一个数组(假设名为a),把读入的n个数塞进这个数组里,然后读入x,

从左到右找一遍,找到了直接输出下标,否则输出-1。

怎么样,是不是很简单?读者朋友可以先试着自己写代码、调试或者提交上去试试,再来看正解哦

正解:

#include<iostream>
using namespace std;
const int MaxN = 10005;
//定义最大值,const表明这个量不能改变
//最好带数组的题都写一下,多开几个空间,
//又防止敲错(以后的题目会出现多个数组)
int a[MaxN], n, x;
//定义变量和数组
int main()
{
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    cin >> x;
    //读入
    for(int i = 0; i < n; i++){
        //从0开始一直找
        if(a[i] == x){        //找到了
            cout << i << endl;//输出
            return 0;         //直接退出程序,不再运行
        }
    }
    cout << -1 << endl;
    //始终没有跳出,说明没找到,输出-1
    return 0;
}

好啦,现在可以将上面的代码和自己的代码对照

一下,有不足也没关系,毕竟是第一次自己写代码,只要认真学习、做题,迟早会超越以前的自己!

3.开关灯

题目传送门:B2092 开关灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

第三道题目相对比较复杂,我们先理一理思路。

看到数据范围,n <= 5000,我们可以开数组a存储开关状态

(即a[i]为0表示第i盏灯关着,为1表示开着)

最开始,我们把数组a全部设成0,从第二个人开始考虑,简化问题。

可以发现,第i个人会从i号灯开始,改变编号为i的倍数的灯的状态。

于是,我们可以从第2个人开始模拟这些人的行为,记录每个人操作后灯的状态。

老样子,各位先自己写代码试一试,再来看下面的解:

#include<iostream>
using namespace std;
const int MaxN = 5005;
//定义大小
int n, a[MaxN];
//定义变量和数组
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) a[i] = 0;
    //初始化状态(从1号开始)
    //实际上因为a定义在main外面,所以初始值本来就是0
    for(int i = 2; i <= n; i++){    //从第2个人开始模拟第i个人的行为
        for(int j = i; j <= n; j += i){   //用j模拟第i个人当前操作路灯的编号
        	//这里的循环变量不要定义成i,即使重名不会报错但外面的i就不能用了,具体大家可以自行了解 
            if(a[j] == 0) a[j] = 1;    //判断条件分支
            else a[j] = 0;
            //==不要写成=
            //实际上可以写成a[j] = !a[j],但是不好理解,建议不要写
        }
    }
    for(int i = 1; i <= n; i++){
        //最后遍历一遍,找到关闭着的灯
        if(a[i] == 0) cout << i << ' ';
    }
    return 0;
}

大家理解后最好自己再写一遍代码,调试后提交,上面的代码仅供参考。

实际上还有更优解,时间更短,这里由于作者懒篇幅原因不赘述,想要了解的可以查看题解。

结语

今天,我们介绍了洛谷这个网站,同时带大家尝试了三道基础题。

大家在课后可以到洛谷网站上,点击左侧的“题库”,选择难度为“入门”的题目,即红题做一做。

当然,有志向有兴趣的朋友也可以尝试看一看橙题,不懂并不丢人,最终通过自己的努力弄懂才是最宝贵的精神和品质。

今天就说那么多,最后,制作不易,如果你觉得这篇文章还不错的话,麻烦点个收藏点个关注,这是免费的,您随时可以取消。你们的支持是作者最大的动力!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

起床气233

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

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

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

打赏作者

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

抵扣说明:

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

余额充值