Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เทคนิค C ++ สำหรับการเขียนโปรแกรมแข่งขัน (สำหรับ C ++ 11)?


ที่นี่เราจะเห็นเคล็ดลับดีๆ ของภาษาการเขียนโปรแกรม C++ ที่สามารถช่วยเราได้ในด้านต่างๆ เช่นเดียวกับถ้าเราต้องการมีส่วนร่วมในกิจกรรมการเขียนโปรแกรมการแข่งขัน เทคนิคเหล่านี้จะช่วยให้เราลดเวลาในการเขียนโค้ดได้ เรามาดูตัวอย่างเหล่านี้กันทีละคน

  • ตรวจสอบว่าตัวเลขเป็นเลขคี่หรือคู่โดยไม่ใช้ตัวดำเนินการ % เคล็ดลับนี้เป็นเรื่องง่าย เราสามารถดำเนินการระดับบิต AND ด้วยตัวเลขและ 1 หากผลลัพธ์ไม่เป็นศูนย์ ค่านี้เป็นเลขคี่ ไม่เช่นนั้นจะเป็นเลขคู่ ตรรกะง่ายเกินไป เลขคี่ทั้งหมดมี 1 ที่ LSb ดังนั้นหลังจากดำเนินการ AND ด้วย 1 มันจะปิดบังอักขระทั้งหมดยกเว้น LSb เพื่อให้เราได้ผลลัพธ์ที่ต้องการอย่างง่ายดาย

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;
  • เราสามารถสลับตัวเลขสองตัวโดยไม่ต้องใช้ตัวแปรตัวที่สาม ซึ่งสามารถทำได้โดยใช้ตัวดำเนินการ + และ – แต่เราสามารถทำได้โดยใช้ตัวดำเนินการ XOR ระดับบิตด้วย คุณสามารถตรวจสอบตัวเลขได้ด้วยตนเองเพื่อให้แน่ใจ

//swap x and y
x ^= y;
y ^= x;
x ^= y;
  • บางครั้งมีข้อจำกัดบางอย่างที่เราไม่สามารถใช้ฟังก์ชัน strlen() ในโค้ดของเราได้ ในกรณีนั้น เราสร้างฟังก์ชัน strlen() ของเราเอง หากกรณีนี้เข้าถึงได้เฉพาะตัวละคร เราก็ไม่จำเป็นต้องทำเช่นนี้จริงๆ เราสามารถตรวจสอบว่าอักขระที่ตำแหน่ง i ถูกต้อง (ไม่ใช่ศูนย์) หรือไม่ หากนี่ไม่ใช่ศูนย์ เราข้ามได้ ไม่เช่นนั้นให้หยุด

for(int i = 0; s[i]; i++){
   cout << s[i];
}
  • บ่อยครั้งที่เราใช้ฟังก์ชัน push_back() ใน STL เพื่อเพิ่มองค์ประกอบใหม่ในคอนเทนเนอร์บางตัว เช่น 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() อัลกอริธึมนี้สามารถใช้เพื่อสร้างช่วงของค่าที่เพิ่มขึ้นตามลำดับราวกับว่าโดยการกำหนดค่าเริ่มต้นเป็น * ก่อน จากนั้นจึงใช้ค่าโดยใช้ตัวดำเนินการ post increment

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 ++ เราสามารถใช้คำหลักโดยไม่ต้องใช้ตัวดำเนินการตามเงื่อนไข เช่นเดียวกับคำหลัก 'และ' สามารถใช้แทน '&' ได้

x = 10;
if(x < 10 and x > 5)
   cout << “True” << endl;
else
   cout << “False” << endl;
//This will return True