C++ 编程竞赛技巧
这里我们将看到一些 C++ 编程语言的优秀技巧,它们可以在不同领域为我们提供帮助。例如,如果我们想参加一些编程竞赛,那么这些技巧将帮助我们减少编写代码的时间。让我们逐一查看这些示例。
不使用 % 运算符检查数字是奇数还是偶数。这个技巧很简单。我们可以对数字和 1 执行按位与运算。如果结果非零,则为奇数,否则为偶数。逻辑太简单了。所有奇数的 LSb 都是 1。因此,在与 1 执行 AND 后,它将屏蔽除 LSb 之外的所有字符,因此我们可以轻松获得所需的结果。
if ((n & 1) != 0){ //这是奇数 } else { //这是偶数 }
使用移位运算符快速进行乘法和除法。如果我们想将一个数字与 2n 这样的数字相乘,那么我们可以简单地将数字向左移 n 次。同样,如果我们想将一个数字除以 2n,则将数字向右移 n 次。
x = 40; y = x << 2; //x 将与 4 相乘,因此 y = 160 cout << x; x = 40; y = x >> 2; //x 将除以 4,因此 y = 10 cout << x;
我们可以交换两个数字而不使用第三个变量。这可以使用 + 和 – 运算符来完成。但我们也可以使用按位 XOR 运算符来完成。您可以手动检查数字以确保无误。
//交换 x 和 y x ^= y; y ^= x; x ^= y;
有时有一些限制,我们不能在代码中使用 strlen() 函数。在这种情况下,我们创建自己的 strlen() 函数。如果情况只是访问字符,那么我们真的不需要这样做。我们可以检查位置 i 处的字符是否有效(非零)。如果非零,我们可以遍历,否则停止。
for(int i = 0; s[i]; i++) { cout << s[i]; }
我们经常使用 STL 中的 push_back() 函数在某些容器(如 vector 等)中添加新元素。如果不使用它,我们也可以使用 emplace_back()。这个函数要快得多。它不会在其他地方分配内存,而是将分配的内存附加到容器中。
C++ 提供了内置的 GCD 函数。我们可以在不同情况下使用它们。语法如下所示。
__gcd(x, y) //查找 x 和 y 的 GCD
主函数中数组的最大大小为 10^6 量级。但如果数组是全局声明的,我们可以将大小声明为 10^7。
我们可以使用对数运算计算任何数字的最高有效位。请参阅以下逻辑以了解这个想法
n = 4578; double k = log10(n); k = k – floor(k); int x = pow(10, k); //x 是最高有效位
使用对数运算直接计算位数。我们不使用任何循环。
n = 4578; int digit_count = floot(log10(n)) + 1
我们可以使用此逻辑直接检查数字是否是 2 的幂。
x = 1024; bool check = x && (!(x & (x-1))); //如果为真,则为 2 的幂。
C++ 中有一些内置算法,可以检查以下条件。
all_of(left, left + n, isPositive()); //检查是否全部为正数 any_of(left, left + n, isPositive()); //检查是否至少有一个为正数。 none_of(left, left + n, isPositive()); //检查没有元素为正数
复制函数用于将元素从一个容器复制到另一个容器。
int src[5] = {10, 20, 30, 40, 50}; int des[5]; copy_n(src, 5, dest);
有一种算法叫做 itoa()。该算法可用于创建一系列连续增加的值,就像先将初始值分配给*,然后使用后增量运算符使用该值一样。
int arr[5] = {0}; char str[5] = {0}; itoa(arr, arr+5, 15); //它将生成{15, 16, 17, 18, 19} itoa(str, str+5, ‘A’); //它将生成{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}
以二进制形式分配值。我们可以在某个二进制数前加上 0b 前缀,以表示该数是以二进制形式提供的。
int x = 0b1101; //那么 x 将保留 13
在 C++ 中,我们可以使用关键字而不使用条件运算符。例如,关键字 ‘and’ 可以代替 ‘&’。
x = 10; if(x < 10 and x > 5) cout << “True” << endl; else cout << “False” << endl; //这将返回 True