C/C++基础学习笔记

目录

1.基本数据类型

整型:short ,int , long , long long

浮点型 float ,double

布尔类型

字符型

2.输入输出

3.位运算

常用的一些技巧


1.基本数据类型

整型:short ,int , long , long long

我们比较常用的是int 和 long long ,为什么会常用long long ,因为它能表示更大的数据范围。

int 是占4个字节,1个字节8位,所以int的范围是(-2^31 ~ 2^31-1)

long long 占8个字节 取值范围 (-2^63 ~ 2^63-1)

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
​
int main()
{
    int n;
    printf("int 表示的最大值%d\n",INT_MAX) ;//2147483647
    printf("long long表示的最大值%lld\n",LONG_LONG_MAX);//9223372036854775807
​
    /*int m =63;
    long long a = 1;
    while(m--) 
    {
        a*=2;
    }
    printf("%lld\n",a-1);//**** long long的最大值 */
    return 0;
}

long long 表示的 int大得多得多。

1036:A×B问题

一行,包含两个正整数AA和BB,中间用单个空格隔开。1≤A,B≤500001≤A,B≤50000。

注意范围 A B 都取最大的话已经超出int范围了,所以要开long long

#include<stdio.h>

int main()
{
    long long  a,b;
    scanf("%lld%lld",&a,&b);
    long long  c = a * b;
    printf("%lld",c);
	return 0; 
}

浮点型 float ,double

通俗的讲就是能表示小数部分,float 占用4个字节,double 占用8个字节,所以double能比float表示更大的范围

小数点的处理

比如保留三位小数,并四舍五入

%.3lf 就是保留三位小数

 double a = 13.58465;
    // 直接输出
    printf("%.3lf",a);//会自动进行四舍五入
    // 如果自己计算 四舍五入 
    a = (int)(a*1000 + 0.5)/1000.0;//.0是能讲int再次转为浮点型
    printf("%lf",a);

奥赛一道题

计算分数的浮点数值

​
#include<stdio.h>
​
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    double c = a*1.0/b;//注意要*1.0 假如5/7 因为int类型会抹去小数部分就会输出0
    //double c = a / b; 
    printf("%.9lf",c);
    return 0;
}

​

布尔类型

C语言中没有布尔类型,但是C++中有。

C++中bool类型的值只有两个,true 和 false 代表真和假

在C语言中想要表示真假可以用非0和0表示,通常用1和0

也可以定义成true 和 false

// c 
#include<stdio.h>
#define true 1
#define false 0
int main()
{
    if(true) printf("1");
    else printf("0");
    return 0;
/*
结果输出1
*/
}

#define 就是宏定义 上面就是将true定义为1,false定义0

字符型

char ,可以读入的类型为字符类型

补充一下字符A的ascll码为65 ,a的ascll码为97,字符0的ascll码为48

printf("%d\n",'A');//65
printf("%d",'a');//97
printf("%d",'0');//48

所以推广出来,大小写字母转换差了32,0-9 字符想要转为整数只需减去48或者'0'.

洛谷一道字符小写转大写的题

【深基2.例6】字母转换 - 洛谷

​
#include<stdio.h>
​
int main()
{
    char c ;
    scanf("%c",&c);
    printf("%c",c-32);
    return 0;
}

​

2.输入输出

这里主要先说一下scanf,cin是C++的读入方式,相较于scanf速度会慢一点,到以后开始刷题的时候就会深刻体会到,scanf非常的神奇尤其是它的读入,下面就开始举一些例子

正常的读入我就不过多说,前面的例子都有设计

比如题目要求读入的格式 6/8 7/9 求6/8+7/9的和 你要怎么获取到6 7 8 9呢

这时候scanf的格式控制的优点就显示出来了,见下

#include<stdio.h>
​
int main()
{
    int a,b,c,d;
    scanf("%d/%d %d/%d",&a,&b,&c,&d);
    printf("%d %d %d %d",a,b,c,d); 
    return 0;
}

同(7,8) (9,10) 怎么获取7 8 9 10呢

#include<stdio.h>
​
int main()
{
    int a,b,c,d;
    scanf("(%d,%d) (%d,%d)",&a,&b,&c,&d);
    printf("%d %d %d %d",a,b,c,d); 
    return 0;
}

有些题的读入就会设计到很多没用的信息,所以我们正好可以通过scanf给读取掉,因为输入的格式是要按照scanf引号里面的格式输入的.

printf 是C语言输出,cout是C++的输出,每个列子都会有涉及,所以就不去讲了.

3.位运算

  • 位运算包含&, | , ~ , ^, << , >>

  • & 按位与运算 ,只有都为1的时候结果才为1,否则为0 (相当于乘法)

  • | 按位或运算,只要有一个1,则结果为1,否则为0(相当于加法)

  • ~ 取反 ,0 -> 1 , 1 -> 0

  • ^ 异或,当两位不相同是位1,相同时为0

  • << 左移 ,右边补0, 左移一位相当于乘以2 , >> 右移 移动几位右边舍弃几位, 右移1位 相当于除以2

常用的一些技巧

1.实现两数的交换

1.a = a ^ b;
2.b = a ^ b;
3.a = a ^ b; 

为什么这样就交换了,我来解释一下

首先我们知道 n ^ 0 = n ,n ^ n = 0 ,

  • 所以 将1式代入2式 就变成 b= a ^ b ^ b = a ^ 0 = a 这个时候b就变成a

  • 在看3, 1带入3, a = a ^ b ^ a(此时第三步的b通过第二步已经是a了,前面的a^b是第一步的a) = 0 ^ b = b

  • 应该是这样没错

#include <iostream>
using namespace std;

int main()
{ 
    int a, b;
    scanf("%d%d",&a,&b);
	printf("交换前的a = %d,b = %d\n",a,b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b; 
	printf("交换后的a = %d,b = %d",a,b);
	return 0;
 } 

2.统计二进制中1的个数

在这之前要先理解补码的概念,一般我们知道的是原码取反+1,但是实质上是最低位1和其右边保持不变,左边取反,所以我们将一个数的原码和补码做与运算,得到的就是最低位1表示的值.

为什么呢,回到上一句补码是最低位1的左边全部取反,按照与运算,补码和原码与运算后最低为左边就都是0了,所以剩下的就是右边没有被取反的了.

(补码 :原码最低位1和其右边保持不变,左边取反) 可以自己写个数试试

下面上代码,可以求二进制中1的个数,也可以求最低为1的值

#include <iostream>
using namespace std;

int lowbit(int x)
{
	return x & -x; // c语言中负数会用补码表示 
}
int main()
{ 
    int n,ans = 0;
    cin >> n;// 输入 13 二进制 1101  
    while(n) //n最后会减到0 
	{
		n-=lowbit(n);//每次减去最低为1  
		ans ++;
	 }
	printf("%d",ans); //3 
	return 0;
 } 

<< N 就是乘上2的N次 , >> N 就是除以2的N次 速度比* 和 /要快

#include <iostream>
using namespace std;

 int main()
 {
 	
 	int a = 4 , b = 48;
 	cout << (a << 2) << endl; // 4 左移两位 16  cout 是C++的输出
 	cout << (b >> 4) << endl;// 48 右移4位  3 
 	
 	return 0;
  } 


持续更新....

如有错误,请大佬们斧正!!!

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值