C++开山解惑篇入门测试题目:a+b(适用于初学者)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++开山解惑篇入门测试题目:a+b(适用于初学者)相关的知识,希望对你有一定的参考价值。
【C++开山】入门测试题目:a+b
Content
给定 a,b,求 a+b。
数据范围: 1 ⩽ a , b ⩽ 4 × 1 0 18 1\\leqslant a,b\\leqslant4\\times10^18 1⩽a,b⩽4×1018.
Solution & Code
本题解仅适用于 C++ 选手。
这道题可谓是 C++ 中最基础的题目之一,先上两份代码:
C++&C
#include <cstdio>
using namespace std;
int main()
long long a, b;
scanf("%lld%lld", &a, &b);
printf("%lld", a + b);
return 0;
C++
#include <iostream>
using namespace std;
int main()
long long a, b;
cin >> a >> b;
cout << a + b;
return 0;
那么这一行行语句都代表着什么呢?这两个程序如何达到相同的效果呢?接下来就对此进行详细讲解。
当然,初学者如果看不懂这些东西其实也无关紧要,因为这些都将在我们今后的学习中逐渐了解。
Part 1 基础语言知识
头文件
首先我们要知道程序最开始的 #include <xx>
是什么意思,其实就是把 C++ 中的一些头文件库给包括进来,这里给几个常见的头文件库:
<cstdio> //输入/输出(这是注释)
<iostream> //输入/输出流
<string> //字符串类
<cstring> //同上
<cmath> //包含了许多实用的数学函数,例如 sin(),cos(),tan(),sqrt(),pow() 等
<algorithm> //STL 通用算法
<stack> //STL 栈容器
<queue> //STL 队列容器
<deque> //STL 双端队列容器
<map> //STL 映射容器
<vector> //STL 动态数组容器
/*
这是多行注释。
STL 可以很方便的简化我们的代码,但是常数很大,
有时运行起来很慢,所以建议知道如何手写。
这将是我们以后学习的内容,现在不知道并无大碍。
*/
对于这道基础题目,我们只需要包含 cstdio
库或者 iostream
库,因为这道题目只需要我们输出 a+b 的结果。
数据类型
然后就是数据类型的问题。我们先不妨认识一些常用的数据类型。下图的这些数据类型(C++ 其他常用数据类型除外)统称为预定义类型,也就是说,这些数据类型是 C++ 已经为你准备好的。
另外,我们还将学到数组、结构体 struct 联合体 union、枚举 enum 等其他比较灵活的类型,这些数据类型统称为自定义数据类型。
那我们如何选择数据类型呢?这得要从数据范围来决定。以下给出了常用数据类型在通常情况下的范围(建议去题解页面查看),对于今后做题时变量应该如何选择数据类型有很大的作用:
关于 long double 的一些说明:long double 是一种扩展精度浮点类型,不一定映射到 IEEE-754 所强制的类型。在 x86 和 x86-64 架构上通常为 80 位 x87 浮点类型。表格中采取的 long double 的数据范围来源于这里
函数
然后就是函数了,函数有头文件库里面自带的,也有你需要在程序中自己写出来的。
比如说 sin()、sort()
这些就是 C++ 的头文件库里面自带的,而通常程序中有些函数需要你自己写出来。在需要自己写出来的函数中,最重要也是最必不可少的就是main()
函数。
一般在算法竞赛中,它的类型通常是 int
,而且最后通常会要求你写 return 0
;,具体的意义不做赘述。除了 main()
函数和头文件库里面自带的函数外,你也可以自己写一些其他的函数,达到精简代码的效果。
输入输出
然后就是输入和输出了,如果你调用的是 cstdio
库的话,它里头包含的最常用的输入函数就是 scanf()
。
scanf()
函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回 EOF
(End of file,即文件结尾)。
例如,对于这道题,我们需要读入 a,b,就用 scanf("%d%d", &a, &b)
,其中 %d
是 int
这个数据类型在 scanf()
函数中的格式,其它的格式还有%f:float、%lf:double、%lld:long long
等。另外,scanf()
函数还有一个强大的功能,就是你可以用 scanf()
按照某一个特定的格式读入数据,例如,你想要按照 hh:mm
的个数读入 hh 和 mm,就可以用 scanf("%d:%d", &hh, &mm)
。
注意,如果是整形类型的话,变量前的 & 必不可少。
为什么要加一个 & 号?
&
是取地址操作符,意思是获得其后的变量的地址。如,&n
表示得到 n 的地址。
scanf()
函数原型:
int scanf(const char *format,...);
函数 scanf()
是从标准输入流 stdio
(标准输入设备,一般是键盘)中读取数据,并保存在对应地址的变量中。变量地址要求有效,并且与格式说明的次序一致。
因此,才需要在变量前面加 &
,但请注意,如果是输入一个字符数组,则无需加 &,例如 scanf("%s", a)
。
这个剪贴板仅供拓展使用,并不强求完全理解,所以如果你并不理解上面这些话也并无大碍。
如果你调用的是 iostream
库的话,它里头包含的输入流(注意!并不是函数)是 cin
。你就把输入流想象成一条河流,源源不断地输入数据就行,这里就不给出严格定义了。在 cin
中,每一个输入的数据以 >>
号连接,前面并不需要加 &
。
然后就是输出了,输出其实和输入很类似,所以这里仅作简略讲解。
scanf()
函数对应的是 printf()
函数,返回成功输出的数据项数。按照和 scanf()
一样的格式,同样也可以按照某个特定格式输出数据,例如 %8d
就可以讲一个整数按以 8 为宽度右对齐输出,%02d
就可以将一个整数输出,并且如果不足两位的话会向前补前导零。例如 printf("%8d, %02d", 2, 2)
对应的输出结果就是:
2, 02
另外如果题目要求保留一位小数或者你的输出应与答案的相对误差不超过
1
0
−
3
10^-3
10−3等要求,那么我们就可以利用 printf
中的按位输出的格式 %.xlf
或者 %.xf
输出(其中 x 里面是数字),例如保留一位小数就可以写成 printf("%.1lf", x);
。
输入流 cin
自然也就对应输出流 cout
,你同样也可以将其想象成一条源源不断地输出数据的河流。但请注意,在 cout
中,每一个输出的数据以 <<
连接!!!除了这个地方和 cin
不同之外,其他的都和 cin
并无差异。
那么 cout 是否也可以做到按位输出或者按某个特定宽度右对齐输出呢?答案是肯定的,但由于版面原因,这里并不做介绍,感兴趣的各位可以直接上网查询。
Part 2 本题你需要了解的一些东西
对于这道题目来说,
1
⩽
a
,
b
⩽
4
×
1
0
18
1\\leqslant a,b\\leqslant4\\times10^18
1⩽a,b⩽4×1018
,因此我们用 long long/signed long long
数据类型。因为在算法竞赛中 long long 常用些,所以这里的代码也用的是 long long 这个数据类型。
/
在 C++ 中的定义并不完全等同于我们平常的四则运算中的除法,如果两边都是整型变量,在 C++ 中,/
默认为整除。
那么有没有办法可以让它变成我们平常的除法呢?
答案是肯定的,让 /
两边中的一个或者两个数变成浮点型变量
(
float
、
double
、
long
(\\textttfloat、\\textttdouble、\\textttlong
(float、double、long等),就可以让 / 的结果变为实际结果而不是整除后的结果了。
又一知识
#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
i64 a,b,c;
int main()
cin>>a>>b; cout<<a+b<<endl;
return 0;
typedef long long ll;
这个操作就是给 long long
换个名字,改成 ll,用了这个之后下面所有的 ll 会自动编译成 long long
。
如代码中多次出现 long long
的时候,就先 typedef long long ll
一下,代码中就可以把所有写 long long
的地方都写成 ll
,代码就会显得比较简洁。
int
:是4字节32bit
,
−
2147483648
−
2147483647
[
−
2
31
,
2
31
−
1
]
-2147483648-2147483647[-2^31 , 2^31-1]
−2147483648−2147483647[−231,231−1],也可以简单记忆为可以表示
1
0
9
10^9
109次方的数,题目的数据超过了int的范围,当错误有时候不知道怎么解决,就是拿不了满分,那就该怀疑数据范围了,可以尝试把int换为 long long
。
typedef int long_int[3];
int main()
long_int arry;
和
int arry[3];
等价
感谢: 洛谷
加油!
感谢!
努力!
以上是关于C++开山解惑篇入门测试题目:a+b(适用于初学者)的主要内容,如果未能解决你的问题,请参考以下文章