2024年CSP-J第一轮暑假冲刺训练营(3):C++&数学

一、进制转换

1. 十进制转 x x x 进制的方法

【整数部分】 x x x 倒取余

  1. 10 10 10 进制数不断除以 x x x,得到商和余数。
  2. 如果除到 0 0 0 了,那么将余数逆序输出就是结果。

【小数部分】 x x x 正取整
3. 将 10 10 10 进制数得小数部分不断乘 x x x,得到积和整数部分。
4. 如果乘得了整数或者题目要求的精度,那么将整数部分顺序输出就是结果。


AC Code

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int n, x;
string ans;
string dict = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main()
{
	cin >> n >> x;
	while (n)
	{
		ans += dict[n%x];
		n /= x;
	}
	reverse(ans.begin(), ans.end());
	cout << ans;
	return 0;
}

2. x x x 进制转十进制的方法

【不分整小】 按权展开求和

  1. 将给定的 x x x 进制数从左到右逐位乘对应的位权,得到相应的 10 10 10 进制数。
  2. 将各个积求和,得到转换后的 10 10 10 进制数。

AC Code
给大家介绍一种懒人函数:

#include <charconv> // 必须导入的头文件
from_chars(InputIt first, InputIt last, T& value, int base=10);
// 将一个字符数组 first 和 last(开始和结束迭代器的区间范围内,并且已知这个区间的进制是 x 进制),将十进制的结果存储在 value 中
#include <iostream>
#include <charconv>
#include <cstring>
using namespace std;

int x, ans;
char n[101];

int main()
{
    cin >> x >> n;
    from_chars(n, n+100, ans, x);
    cout << ans;
    return 0;
}

二、位运算

1. 按位与 &

例题: ( 1101101 ) 2 & ( 101001 ) 2 = ( 0101001 ) 2 (1101101)_2 \& (101001)_2=(0101001)_2 (1101101)2&(101001)2=(0101001)2

数字11101101
数字20101001
结果0101001

技巧:全 1 1 1 1 1 1,一 0 0 0 0 0 0

2. 按位或 |

例题: ( 1101101 ) 2 ∣ ( 101001 ) 2 = ( 1101101 ) 2 (1101101)_2 | (101001)_2=(1101101)_2 (1101101)2(101001)2=(1101101)2

数字11101101
数字20101001
结果1101101

技巧:全 0 0 0 0 0 0,一 1 1 1 1 1 1

3. 按位异或 ^

例题: ( 1101101 ) 2 (1101101)_2 (1101101)2 ^ ( 101001 ) 2 = ( 1000100 ) 2 (101001)_2=(1000100)_2 (101001)2=(1000100)2

数字11101101
数字20101001
结果1000100

技巧:不同则 1 1 1,否则为 0 0 0

4. 按位取反 ~

例题:   ( 1101101 ) 2 = ( 0010010 ) 2 ~ (1101101)_2=(0010010)_2  (1101101)2=(0010010)2

数字1101101
结果0010010

技巧: 1 1 1 0 0 0,否则为 1 1 1

5. 按位左移 <<

例题: ( 1101101 ) 2 < < ( 2 ) (1101101)_2 << (2) (1101101)2<<(2) 10 10 10 = ( 110110100 ) 2 =(110110100)_2 =(110110100)2
技巧:左移 n n n 位就添 n n n 0 0 0

6. 按位右移 >>

例题: ( 1101101 ) 2 > > ( 2 ) (1101101)_2 >> (2) (1101101)2>>(2) 10 10 10 = ( 0011011 ) =(0011011) =(0011011) 2 2 2
技巧:右移 n n n 位就取前 n n n

三、原码反码补码

我们知道,计算机中的数分为有符号数(signed,可以表示正数、负数和 0 0 0)和无符号数(unsigned,只能表示正数和 0 0 0)。

1. 原码

对于有符号数而言,规定最高位是符号位, 0 0 0 表示正数, 1 1 1 表示负数,非符号位是该数字绝对值的二进制。

2. 反码

规定正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(原码)不变。

3. 补码

规定正数的补码与原码一致,负数的补码对反码 + 1 +1 +1(不看原码)。

四、指针地址

程序作用
int &a = b;表引用
&p取地址
int *p;定义指针
*p获取值

黑客园地 Hacker’s Den
当你调用函数的时候,可以这么写。

int func()
{
    ...
}

int main()
{
    int (*f)() = func;
    int ans = f();
    return 0;
}
#include <iostream>
using namespace std;

int main()
{
    int x = 100;
    int *p = &x; // 定义一个指向 x 地址的指针 p
    int &y = x;
    cout << &x << " " << p << endl; // 两种获取 x 地址的方法
    *p = 5; // 间接修改 x 的值为 5
    cout << *p << " " << x << " " << y; // 三种获取 x 值的方法
    return 0;
}
  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值