C++ 竞赛编程技巧(适用于 C++ 11)?
这里我们将学习一些C++编程语言的实用技巧,这些技巧可以帮助我们在不同的领域提高效率。例如,如果我们想参加一些编程竞赛,这些技巧将有助于我们缩短编写代码的时间。让我们逐一看看这些例子。
不用%运算符检查数字是奇数还是偶数。这个技巧很简单。我们可以对数字和1执行按位与运算。如果结果非零,则为奇数,否则为偶数。逻辑很简单。所有奇数的最低有效位都是1。因此,与1进行AND运算后,它将屏蔽除最低有效位之外的所有位,因此我们可以轻松获得所需的结果。
if ((n & 1) != 0) { //this is odd } else { //This is even }
使用移位运算符进行快速乘法和除法。如果我们想将一个数字乘以2n,我们可以简单地将该数字左移n位。类似地,如果我们想将一个数字除以2n,则将该数字右移n位。
x = 40; y = x << 2; //x will be multiplied with 4, so y = 160 cout << x; x = 40; y = x >> 2; //x will be divided by 4, so y = 10 cout << x;
我们可以不用第三个变量交换两个数字。这可以使用+和-运算符来完成。但是我们也可以使用按位异或运算符来完成。您可以手动检查数字以确保。
//swap x and 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) //find GCD of x and y
主函数中数组的最大大小约为10^6。但是如果数组在全局声明,我们可以声明大小到10^7。
我们可以使用对数运算计算任何数字的最高有效位。请参阅以下逻辑以了解其思想。
n = 4578; double k = log10(n); k = k – floor(k); int x = pow(10, k); //x is the most significant digit
使用对数运算直接计算位数。我们不为此使用任何循环。
n = 4578; int digit_count = floot(log10(n)) + 1
我们可以使用此逻辑直接检查数字是否是2的幂。
x = 1024; bool check = x && (!(x & (x-1))); //if this is true, then power of two.
C++中有一些内置算法可以检查以下条件。
all_of(left, left + n, isPositive()); //check all are positive or not any_of(left, left + n, isPositive()); //check at least one positive or not. none_of(left, left + n, isPositive()); //check no elements are positive
复制函数用于将元素从一个容器复制到另一个容器。
int src[5] = {10, 20, 30, 40, 50}; int des[5]; copy_n(src, 5, dest);
有一个名为itoa()的算法。该算法可用于创建一系列按顺序递增的值,就像为*first赋值初始值,然后使用后增量运算符使用该值一样。
int arr[5] = {0}; char str[5] = {0}; itoa(arr, arr+5, 15); //it will generate {15, 16, 17, 18, 19} itoa(str, str+5, ‘A’); //it will generate {‘A’, ‘B’, ‘C’, ‘D’, ‘E’}
以二进制形式赋值。我们可以使用0b前缀和一些二进制数来表示该数字是以二进制形式提供的。
int x = 0b1101; //then x will hold 13
在C++中,我们可以使用关键字而不使用条件运算符。例如,关键字'and'可以代替'&'。
x = 10; if(x < 10 and x > 5) cout << “True” << endl; else cout << “False” << endl; //This will return True