คำตอบของ Sparky เป็นวิธีมาตรฐานในการแก้ปัญหานี้ แต่ในขณะที่ฉันเขียนไว้ในความคิดเห็นของคุณคุณก็เสี่ยงต่อการล้น สิ่งนี้สามารถแก้ไขได้โดยใช้ชนิดที่กว้างขึ้น แต่ถ้าคุณต้องการหารlong long
s?
คำตอบของ Nathan Ernst เป็นคำตอบเดียว แต่มันเกี่ยวข้องกับการเรียกฟังก์ชันการประกาศตัวแปรและเงื่อนไขซึ่งทำให้ไม่สั้นกว่ารหัส OPs และอาจช้ากว่าเพราะยากต่อการปรับให้เหมาะสม
ทางออกของฉันคือ:
q = (x % y) ? x / y + 1 : x / y;
มันจะเร็วกว่าโค้ด OPs เล็กน้อยเนื่องจากโมดูโลและการหารนั้นใช้คำสั่งเดียวกันบนโปรเซสเซอร์เนื่องจากคอมไพเลอร์สามารถเห็นได้ว่ามันเทียบเท่ากัน อย่างน้อย gcc 4.4.1 ทำการปรับให้เหมาะสมนี้ด้วยแฟล็ก -O2 บน x86
ในทางทฤษฎีแล้วผู้รวบรวมอาจอินไลน์การเรียกใช้ฟังก์ชันในโค้ดของ Nathan Ernst และปล่อยสิ่งเดียวกัน แต่ gcc ไม่ได้ทำอย่างนั้นเมื่อฉันทดสอบ อาจเป็นเพราะมันจะผูกรหัสที่คอมไพล์กับไลบรารี่มาตรฐานรุ่นเดียว
ในฐานะที่เป็นบันทึกสุดท้ายไม่มีสิ่งใดที่เกิดขึ้นกับเครื่องจักรที่ทันสมัยยกเว้นในกรณีที่คุณอยู่ในวงวนอย่างมากและข้อมูลทั้งหมดของคุณอยู่ในทะเบียน มิฉะนั้นโซลูชันเหล่านี้ทั้งหมดจะเร็วพอ ๆ กันยกเว้นอาจเป็นไปได้ของ Nathan Ernst ซึ่งอาจช้าลงอย่างมากหากฟังก์ชันต้องดึงข้อมูลจากหน่วยความจำหลัก
q = x/y + (x % y != 0);
เพียงพอแล้ว