蓝桥杯笔记


蓝桥杯笔记


目录


  1. 保留小数
  2. #include <cmath>中的函数
    2.1round函数
    2.2 pow函数
  3. Fibonacci数列求余
  4. 动态分配数组
  5. C++ string
  6. 十六进制转换为八进制
  7. ASC码
  8. 进制转换
  9. #include <algorithm>中的函数
    9.1 sort函数
    9.2reverse函数
    9.3find函数
    9.4fill函数
    9.5swap函数
    9.6__gcd函数
  10. 万能库模板
  11. sizeof和strlen
  12. 判断质数(素数)
  13. 动态创建二维数组
  14. 闰年定义

内容


1. 保留小数

cout<< fixed<<setprecision(7)<<x;   //输出小数点后7位
setprecision(7)  //表示保留7位有效数字
fixed  //流操作符,表示浮点输出应该以固定点或小数点表示法显示

2. #include <cmath>中的函数

2.1 round函数(四舍五入)

对于小数而言,round()函数仅仅保留到整数位,即仅仅对小数点后一位四舍五入 如果想要保留小数位数,则可以先乘后除
floor不大于自变量的最大整数
ceil不小于自变量的最大整数
round四舍五入到最邻近的整数
floor(),ceil() 需包含头文件<cmath>
C++中没有直接的round函数 需自己建立
double round(double r)
{
  return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}

round函数参考用法


2.2 pow函数

double pow( double x, double y )
1.用法

pow函数属于<cmath>库中的函数,pow(x,y)表示x的y次幂

2.注意事项
  • x必须大于0
  • x,y必须有一个是小数
    例:pow(x,3.0)

3. Fibonacci数列求余

题目地址
问题描述:Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数

#include "iostream"
using namespace std;
int main()
{
    long n; cin >> n;
    long f1 = 1, f2 = 1, f = 1;
    for (long i = 3; i <= n; i++)
    {
        f = (f1 + f2) % 10007;
        f1 = f2;
        f2 = f;
    }
    cout << f << endl;
    return 0;
}

4.动态分配数组

一维数组:
	int* a=(int*)malloc(sizeof(int)*n);
	free(a);int* a=new int[n];
	delete []a;
二维数组:
//创建
 	int* p = new [m];
    for(int i=0;i<m;++i)
    {
        int p[i] = new [n];
    }
//释放
    for(int i=0;i<m;++i)
    {
        delete []p[i];
    }
    delete []p;

在Dev-c++中,要用malloc头文件
或者报错[Error] ‘system’ was not declared in this scope 时头文件要加上

#include <cstdlib>


5.C++ string

5.1 头文件

#include <string>

5.2 创建方式

string s0 ("Initial string");  //根据已有字符串构造新的string实例
string s1 (s0);         //通过复制一个string构造一个新的string
string s2 (s0.begin(), s0.begin()+7);  //通过迭代器来指定复制s0的一部分,来创建s2

5.3 operator+=:附加到字符串

str3 = str1 + str2;

5.4 size/length

str.length()或str.size():返回string的长度,二者没有任何区别 

5.5 string::operator[ i ]:获取字符串的字符

string str ("Test string");
for (int i=0; i<str.length(); ++i)
{
    cout << str[i];
}

5.6 string::c_str:获取C字符串等效

  • cout 可直接输出 string 类的对象的内容;
  • 使用 c_str() 方法转换 string 类型到 char* 类型时,需要为char*添加 const 关键字;
  • printf() 函数不能直接打印 string 类的对象的内容,可以通过将 string 转换为 char* 类型,再使用 printf() 函数打印
string strOutput = "Hello World";
cout << "[cout] strOutput is: " << strOutput << endl;
// string 转换为 char*
const char* pszOutput = strOutput.c_str();

6.十六进制转换为八进制

!知识点: 字符'0'的ASC码为48,字符'1'转换成数字1要s[i]-48

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string s[100];
int main()
{
    int n;
    int cnt = 0;
    cin >> n ;
    string s1,s2;

    for(int i=0;i<n;i++)
	{
        cin >> s1;
        s2="";
        //16进制转换为2进制
        for(int j=0;j<s1.length();j++)
		{
            switch (s1[j])
            {
            case '0': s2 += "0000";break;
            case '1': s2 += "0001";break;
            case '2': s2 += "0010";break;
            case '3': s2 += "0011";break;
            case '4': s2 += "0100";break;
            case '5': s2 += "0101";break;
            case '6': s2 += "0110";break;
            case '7': s2 += "0111";break;
            case '8': s2 += "1000";break;
            case '9': s2 += "1001";break;
            case 'A': s2 += "1010";break;
            case 'B': s2 += "1011";break;
            case 'C': s2 += "1100";break;
            case 'D': s2 += "1101";break;
            case 'E': s2 += "1110";break;
            case 'F': s2 += "1111";break;
            default:
                break;
            }
        }
        //二进制转换为8进制,3位换1位,不足补齐
        if(s2.length()%3 ==1)
            s2="00"+s2;
        if(s2.length()%3 ==2)
            s2="0"+s2;
        int flag=0;//一次性标记位,第一个非零p出现后标志位全为1,后面即使p=0也要补上一个字符0 
        for(int k=0;k<s2.length()-2;k+=3)	//s2-2是正好最后一组 
		{
            //字符串转为数字
           int p = 4*(s2[k]-'0') + 2*(s2[k+1]-'0') + s2[k+2]-'0';
           //'0'的ASC码为48,字符'1'转换成数字1要s[i]-48 
			if(p)  	flag=1;	//0要不要出现的不可逆转折点 
            if(flag)
				s[cnt] += '0' + p;

        }
        cnt++;
    }
    for(int m=0;m<cnt;m++)
	{
        cout << s[m] << "\n";
	}   
    system("pause");
    return 0;
}

7.ASC码

字符'0'的ASC码为48,字符'A'为65,字符'a'为97

数字'1'转换成字符1要+48;数字15转换成字符'F'要+55

asc


8.进制转换

  • 进制控制只适用于整型变量,不适用于实型和字符型变量。
  • 在cin或cout中指明数制后,该数制将一直有效,直到重新指明使用其他数制。
	long long n;
	cin>>hex>>n;	//16进制
	cout<<oct<<n;	//8进制
	cout<<dec<<n;	//10进制

	#include <bitset>
	cout<<bitset<8>(a)<<endl;	//<>内为要输出的位数,必须指定

任意进制转化为10进制:strtol()函数

将char数组转化为int
函数原型:long int strtol(const char *nptr, char **endptr, int base)
格式:base是数的原进制,非法字符会赋值给endptr,nptr是要转化的字符

 char a[20]="10549stend#12";  
 char *stop;  
 int ans=strtol(a, stop, 8);   //将八进制数1054转成十进制,后面均为非法字符

10进制转化为任意进制:itoal()函数

int转化为char数组
函数原型:char* itoa(int value,char* string,int radix);
格式:itoa(num, str, 2); num是一个int型的,是要转化的10进制数,str是转化结果,后面的值为目标进制。

 int num = 10;  
 char str[100];  
 itoa(num, str, 2);  

9. #include <algorithm>中的函数

9.1 sort函数

sort(begin,end,cmp)
  • 第一个是要排序的数组的起始地址。
  • 第二个是结束的地址(最后一位要排序的地址)
  • 第三个参数是排序的方法,不写默认从小到大排序。
  • 第三个参数还可以升序:less<数据类型>(),降序greater<数据类型>()
  • 字符排序:sort(a,a+10,greater<char>( ) );
//升序:
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10);

//降序:
bool cmp(int a,int b)
{
 return a>b;
}
sort(a,a+10,cmp);//在这里就不需要对complare函数传入参数了,这是规则

//传参用法
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10,less<int> ( ) );
sort(a,a+10,greater<int> ( ) );

9.2 reverse函数

reverse(a,a+10)
  • 有两个参数;将区间 [it, it+10)内的元素翻转
  • 第一个参数指向第一个元素,第二个元素指向末尾元素的下一个位置
int a[]={1,2,3,4,5,6,7,8,9,10};
 reverse(a,a+10);	//从a[0]到 a[10]
//操作区间为[a,b),reverse()中第一个参数指向第一个元素,第二个元素指向末尾元素的下一个位置

9.3 find函数

find(n, n+10, x)
  • 前两个参数为查找区间,第三个参数为待查找元素,即在[a, b)这个区间内查找x
  • 查找成功返回对应元素的位置,即若操作对象是数组就返回指针,指针指向对应元素的位置
int a[]={1,2,3,4,5,6,7,8,9,10};
int* p1=find(a,a+10,8);

string str("abcdefgh");
string::iterator iter1=find(str.begin(),str.end(),'d');

9.4 fill函数

fill(n, n+10, x)

前两个参数为填充区间,第三个参数为待填充的数据,可以是任意数值

//一维数组
int v[10];
fill(v,v+10,-1);

//二维数组
int v[10][10];
fill(v[0],v[0]+10*10,-1);

与之效果相同的是memset函数

	int a[26];
	memset(a,1,26*4); 
	fill(a,a+26,0);

9.5 swap函数

swap(x, y)
int x=0;int y=9;
char x = 'X', y = 'Y';
swap(x,y);

9.6 __gcd函数

最大公因数:
__gcd(a,b)

用于求x,y的最大公约数。x,y不能是浮点数

	// 最大公因数
	int a=8;int b=12;
	cout<<__gcd(a,b);
	cout<<" 4 ";
	//最小公倍数
	cout<<a*b/__gcd(a,b);
	cout<<"24";
最小公倍数:

两数的乘积除以最大公因数


10. 万能库模板

#include <bits/stdc++.h>


11. sizeof和strlen

sizeof()可以计算所有类型,strlen()仅计算字符串

char *a="Hello world";
char b[5];
memset(b,'\0',sizeof(b)); // 经典字符串初始化操作,会给字符数组的每一个值都赋值'\0'
//对char赋值'\0'和0都是终止符,想赋0的话是字符'0'

sizeof(a) = 8 ;     // 64位系统,8代表的是指针的大小,指针占8字节
sizeof(b) = 5 ;     // 计算字符串数组的结果是真实的字符数组大小

strlen(a) = 11;      //  真实字符串大小,一般的系统函数若返回值为char*类型,也会自动在末尾加上'\0',故在初始化后,strlen是可以用的。空格算入其中
strlen(b) = 0;        //  经过memset初始化后,全部内容都是‘\0’,strlen轮询第一个字符的时候就碰到'\0',故结果为0

char b[5]={'1','1','1','1','1'};
strlen(b) = 随机数; //因为没有位置放'\0'了

char b[6]={'1','1','1','1','1'};
strlen(b) = 5; //说明char数组要设置的大一点

12. 判断质数(素数)

质数:除了1和它自身外,不能被其他自然数整除的数叫做质数
2,3,5,7,11,13,17等

for(int i=5;i<n;i++)	//从5到n的质数,2和3要特殊处理
		{
			int j;int flag=0;	//flag判断是否被整除过
			for(j=2;j<=(int)sqrt((double)i);j++)	//除到开方就够了,开方回来是double
			{
				if(i%j==0)	//除了1和自身外,能被其他自然数整除就不是质数
				{
					flag=1; 	//不是质数
					break;
				}
			}
			if(flag==0)		//是质数
			{
					a[count]=i;
					count++;
			}
		}

13. 动态创建二维数组

int **a=new int*[m];
for(int i=0;i<m;i++)
		a[i]=new int[s];

14. 闰年定义

能被400整除 或者 能被4整除不能被100整除
year%400==0 || (year%4==0&&year%100!==0)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值