蓝桥杯基础知识记录
文章目录
规模太大怎么办
对于能够使用公式求和的方式就尽量使用公式(PS:记录我死在了暴力循环求1-n的和上)
保留小数点后x位
//我们需要导入一个库,在()中输入需要保留的位数
#include<iomanip>
#include<iostream>
int main(){
cout << setiosflags(ios::fixed) << setprecision(7) << x << endl;
}
关于圆周率π的使用
#include<iostream>
#include<math.h>
#define PI acos(-1)
int main(){
cout << PI;
}
关于二进制字符输出
这是题目的源码,让我来解释一下,bitset中的用来指定输出参数的位数(PS:虽然我这里有点复杂,sizeof是用来取其()中的类型的字节数,毕竟如果泛化的话x可以是double或float之类的),(x)是要输出的数字
#include <iostream>
#include <bitset>
using namespace std;
int main(){
int x;
for(x=0;x<32;x++){
cout<<bitset<sizeof(1)/4*5>(x)<<endl;
}
return 0;
}
关于规律题出现
我在做基础训练3的时候遇到的,这是一个规律题,鉴于这是开放题,请读者勤快一点自己看看吧。
我们对于规律必须仔细辨认,千万不要没有读懂就写!!!,没读懂的代价就是在一定的极端情况下我们难以保障代码的正确性,尤其是像某些ACM比赛中提交错误会扣时,一定要考虑啊!!!
c++关于最大值最小值的定义
但是在编译时他出现了一些问题,显示了一个warning:[Warning] “INT_MAX” redefined,原因竟然是这个在c++中是已经有定义的!!!,大家可以直接用,INT_MIN和INT_MAX
#define INT_MAX 0x7fffffff
#define INT_MIN 0x80000000
对于i++和++i的辨析
i++的操作是在其他操作后面的,而++i则在其他操作前面,就用最简单的赋值举例子,当i=1时,如果res=i++,那么res=1,而res=++i的话,res=2
对于自己要用的函数不知道在那个库时
这边给您一个网传的万能库
#include<bits/stdc++.h>
当stream流效率不够时
建议使用原生态的scanf和printf,似乎是这两个的效率不cin和cout效率高,当你的时间无法达到要求是,可以使用这个(PS:有时候你要是不会读取整行字符串时,可以尝试使用scanf,有效果哦)
三目运算符x1?x2:x3
首先声明,这玩意儿实在是我目前为止太少用到,所以记录一下
对于这个三目运算形式如上所示,以及作用为:当x1为真时计算x2表达式的值,为假时计算x3表达式的值
赋值运算符
对于这段,和上面三目一样,为了记录这个我太少用到的
赋值运算符有很多,如下:
符号 | 含义 | 说明 | 例子 |
---|---|---|---|
&= | 按位与 | 相当于a=a&b | 比如9&5,相当于(00001001)&(00000101)=(00000001) |
|= | 按位或 | 相当于a=a|b | 比如9 |
^= | 按位异或 | 相当于a=a^b | 异或就是:1^1=0,1^0=1,0^0=0,0^1=1;比如9^5相当于(00001100) |
>>= | 右移赋值 | 相当于将运算数的二进制数向右移动两位a=a<<4 | 比如a=00000011,过后便是00110000,相当于原值乘以 2 4 2^{4} 24 |
<<= | 左移赋值 | 相当于将运算数的二进制数向左移两位a=a>>4 | 比如a=15(00001111),过后就是00000011这个不能单纯的以乘除计算,因为他可能溢出 |
关于字符串的读取
我们可以使用gets()函数读取字符串,可以用getchar()函数读取回车,以及getline()函数读取整行字符串
char str[]
gets(str)将输入的字符串读入到str数组中
getchar()读取用于换行的回车
getline()读取整行字符串
关于素数的判断
我在网上看到有三种方法:
- 暴力破解法:直接遍历一遍2-n-1,看是否能够被整除
bool isPrime_1(int n){
for(int i=2;i<n;i++)
if(n%i==0&&i<n) return 0; //注意2是质数
return 1;
}
- 小范围暴力破解法:由于因数必定是一个大于 n \sqrt n n一个小于 n \sqrt n n,因此我们只需要遍历2- n \sqrt n n即可
bool isPrime_2(int n){
for(int i=2;i<int(sqrt(n)+1);i++)
if(n%i==0){
return 0;
}
return 1;
}
- 这个方法是我看来的,是通过关于一个素数的性质,素数必定在6的倍数两侧,但是注意,6的倍数的两侧不一定是素数,因此我们还需要增加一个判断,但是这个性质为我们的步长从1变成了6,大大的缩小了范围
bool isPrime_3(int n){
if(n==2||n==3) return 1;
if(n%6!=1&&n%6!=5) return 0;
for(int i=5;i<=floor(sqrt(n));i+=6)
if(n%i==0||n%(i+2)==0) return 0;
return 1;
}
PS:这个代码我是从别人的博文上面摘的,毕竟这个东西应该是没有必要在在即写一遍了的,但是尊重作者附上链接:素数的四种判断方法
注:这玩意儿今晚只做了这么多,下次还要继续写!!!