C++ 初赛 - Class 2

Class 2

  • 进制转换

   我们一般计算中常用 1010 进制,而电脑中的运输使用 22 进制。还有许多进制(常见的如 88 进制、1616 进制)。

1.\large1. 1010 进制转 kk 进制。

   代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,k; char digit[35];
int d_change() {
    int m=0;
    while(n) {
        int r=n%k;
        if(r<10) digit[++m]=r+'0'; //10 -> 9/8...
        else digit[++m]=(r-10)+'A'; //10 -> 11/12...
        n/=k;
    }
    for(int i=1,j=m;i<=j;i++,j--) 
        swap(digit[i],digit[j]);
    return m;
}
int main() {
 	scanf("%d%d",&n,&k);
 	int len=d_change();
 	for(int i=1;i<=len;i++)
	 	printf("%c",digit[i]);
	return 0;
}
//code by TheCedar

主要思路是短除法,每次都将原数 nnkk 取余,用 digitdigit 数组存储下来,最后倒序输出即可。

2.\large2. kk 进制转 1010 进制。

   其实就是 1010 进制转 kk 进制的逆过程,其实是一样的。

  • 原码,反码,补码及其之间的相互运算

原码 反码 补码
正数 符号位为 00 反码 == 原码 补码 == 原码
负数 符号位为 11,其他位是该数绝对值的二进制数。 符号位不变,其它为为原码取反。 补码 == 反码 +1+1

   如下题:求整数 2022-20221616 位二进制补码。

2022O=1000 0111 1110 0110-2022_{O} = \texttt{1000 0111 1110 0110}

2022I=1000 1000 0001 1001-2022_{I} = \texttt{1000 1000 0001 1001}

2022C=1000 1000 0001 1010-2022_{C} = \texttt{1000 1000 0001 1010}

注:
原码Original Code 上面简称 OO

反码Inverse Code 上面简称 II

补码Complementary code 上面简称 CC

   2022\therefore -20221616 位补码为 1000 1000 0001 1010\texttt{1000 1000 0001 1010}

  • 位运算的初步认识与使用

符号 名称 运算规则
&\& 两位都为 11 时为 11,否则为 00
| 有一位为 11 时为 $$1,否则为 00
~ 取反 01,100 \to 1 , 1 \to 0
^ 异或 两位不同为 00,两位相同为 11
<<<< 左移 将二进制数位整体向左移动若干位,高位丢弃,空位补 00
>>>> 右移 将二进制数位整体向左移动若干位,低位丢弃,高位补 00

Example:位运算的一些特殊用法。

   1. 判断奇偶性。

if(x&1) cout<<"even"; //奇数
else cout<<"odd"; //偶数

   2. 判断整数 xx 的二进制中倒数第 ii 位是否为 11

if(x&(1<<(i-1))) ... // x 的二进制中第 i 位为 1.
else ... // x 的二进制中第 i 位为 0.

   3. 将整数 xx 的二进制倒数第 ii 位变为 11

x=x|(1<<(i-1));

   4. 将整数 xx 的二进制中最后一个 11 变为 00

x=x&(x-1);
  • 计数基本原理

   如下题:由 1,1,2,2,31,1,2,2,3 这五个数字组成不同的三位数有几种?

--- From CSP-J, 2021.\qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \texttt{--- From CSP-J, 2021.}

   易得,总共有一下几种序列,每个序列能组合出的三位数数都可以是符合题意的三位数,统计这些三位数的个数即可。

<1,2,3>6\left< 1,2,3 \right> \to 6

<1,1,2>3\left< 1,1,2 \right> \to 3

<1,1,3>3\left< 1,1,3 \right> \to 3

<2,2,1>3\left< 2,2,1 \right> \to 3

<2,2,3>3\left< 2,2,3 \right> \to 3

=6+34=18\therefore 总方案数 = 6+3*4= 18 种

  • 排列 & 组合

   如下题 66 个人,两个人组一队,总共组成三队,不区分队伍的编号,问不同的组队情况有几种。

--- From CSP-J, 2021.\qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \texttt{--- From CSP-J, 2021.}

   易得,总方案数为如下式子:

C62×C42×C22A33=15×6×16=15\dfrac{C_6^2 \times C_4^2 \times C_2^2}{A_3^3} = \dfrac{15 \times 6 \times 1}{6} = 15