Blogs

นับจำนวนที่หาร N ลงตัวแบบเร็วๆ ตอนที่ 2 (เร็วกว่าเดิม ง่ายกว่าเดิม)

พอดีเมื่อวานผมเปิดอ่านหนังสือ Combinatorics ก็เห็นตัวอย่างโจทย์นับจำนวนที่หารลงตัวก็เลยบ้าจี้ลองเขียนโปรแกรมตามดู ซึ่งจริงๆแล้วเรามีวิธีที่สามารถคำนวนจำนวนที่หาร $N$ ลงตัวได้เร็วกว่า แล้วก็ง่ายกว่าด้วยครับ ไม่ต้องมานั่งหา prime ฮินดูอะไรนั่น เรียกได้ว่าสูงสุดคืนสู่สามัญจริงๆ ลองมาดูกันเลยครับ

วิธีนี้ก็จะประยุกต์จากเทคนิคที่ใช้หาค่า prime ในคราวก่อน นั่นคือวนรอบเท่ากับจำนวน $sqrt(N)$ ลองดูตัวอย่าง จำนวนที่หาร $N$ ลงตัวในแต่ละตัวดูครับ

Taxonomy upgrade extras: 

นับจำนวนที่หาร N ลงตัวแบบเร็วๆ

สมมติว่าเราต้องการหาว่าจำนวนทั้งหมดที่หาร N ลงตัวมีกี่จำนวน เช่น จำนวนที่หาร 10 ลงตัวมี 4 จำนวน ได้แก่ 1, 2, 5 และ 10 และจำนวนที่หาร 25 ลงตัวมีทั้งหมด 3 จำนวน ได้แก่ 1, 5, 25 วิธีที่ง่ายที่สุดก็คือการวนรอบตั้งแต่ค่า 1 จนถึง N แล้วดูว่ามีจำนวนใดบ้างที่หาร N ลงตัวก็จะนับเพิ่ม 1 ครั้ง ซึ่งก็จะได้โค้ดออกมาหน้าตาประมาณนี้ครับ

Taxonomy upgrade extras: 

Truncate, Floor, Ceiling และ Round

ฟังก์ชันหลักสำหรับการแปลงค่าจากเลขจำนวนจริง (floating-point) ไปยังจำนวนเติม (integer) ที่มีอยู่ในเกือบทุกภาษาคือ Trancate (trunc), Floor, Ceiling (ceil) แล้วก็ Round ครับ ซึ่งบางทีดูเผินๆแล้วอาจเกิดความสับสนได้ว่ามันต่างกันตรงไหน ซึ่งการจะเลือกใช้ให้ถูกนั้นเราจำเป็นที่จะต้องเข้าใจถึงนิยามของแต่ละตัวซะก่อน

Truncate - คือการตัดเศษทิ้งครับ พูดง่ายๆคืออะไรที่อยู่หลังจุดเอามันออกให้หมด อย่าง trunc(4.67) ก็จะได้ค่า 4 โดยไม่สนว่าเลขหลังจุดจะมีค่าเท่าไหร่

Taxonomy upgrade extras: 

Memory Debugging ด้วย Valgrind (ภาค 2 - ตีแผ่ Error แบบต่างๆ)

ต่อจากคราวก่อนนะครับ คราวนี้เราจะมาดูกันว่า Valgrind สามารถ ตรวจจับ Error แบบไหนได้บ้าง แล้วมันฟ้องออกมายังไงกัน

1. อ่านข้อมูลผิด (Invalid Read)

Taxonomy upgrade extras: 

Memory Debugging ด้วย Valgrind

เช้าวันนึงขณะที่ผมกำลังทำงาน ก็พบขึ้นมาว่าโปรเจคที่ตัวเองทำอยู่ จู่ๆมันก็พังขึ้นมาตอนรันซะงั้น (ได้ไง T_T) มองผ่านๆก็ยังหา Error ไม่เจอซักที รู้แต่มันฟ้องว่ามีปัญหาที่การจัดการ Memory (เป็นที่ฟังก์ชัน realloc กับ free) ผมจึงเริ่มไปค้นว่ามีวิธีไหนบ้างมั้ย ที่จะช่วยเช็คว่าปัญหาอยู่ตรงไหนกันแน่ เพราะตอนนั้นหายังไงก็หาไม่เจอจริงๆ (เป็นโค้ดที่คนอื่นเขียน ผมอ่านแล้วก็มึนๆเล็กน้อย) ลองหาตามบอร์ดก็เลยไปเจอเจ้า tool ตัวนึงที่ชื่อ Valgrind ซึ่งหลังจากลองใช้แล้วก็พบว่าปาฏิหาริย์มีจริง มันหาตำแหน่งของโค้ดที่จัดการกับ Memory ไม่ถูกต้องให้ได้ดีทีเดียว

Taxonomy upgrade extras: 

แนะนำเว็บดีๆ Project Euler

ประมาณอาทิตย์ก่อนผมได้หาข้อมูลของอัลกอริทึมอะไรซักอย่าง ซึ่งก็ลืมไปแล้วเหมือนกัน ก็บังเอิญไปเจอกับเว็บเว็บนึง ชื่อ Project Euler ซึ่งเป็นเว็บที่รวมปัญหาคณิตศาสตร์ที่ใช้การเขียนโปรแกรมในการแก้ ซึ่งผมก็ลองเล่นข้อง่ายๆ เลเวลต่ำๆดูก็รู้สึกว่าสนุกดีเหลือเกิน ขนาดทำข้อง่ายๆยังรู้สึกว่าได้รู้อะไรใหม่ๆเพิ่มขึ้นจากการคิดวิธีในการหาคำตอบหลายๆวิธี

Taxonomy upgrade extras: 

Lex & YACC (ตอนที่ 1)

บทความนี้ อาจมีการอ้างอิงทฤษฎีพื้นฐานของภาษาโปรแกรม (Programming Language) และการสร้างคอมไพเลอร์ ผู้อ่านควรมีความรู้พื้นฐานในส่วนนี้เล็กน้อย เพื่อที่จะทำความเข้าใจได้เร็วขึ้น

Taxonomy upgrade extras: 

จำลอง Linux Environment บน Windows ด้วย Cygwin

บางครั้งในการทำงาน เราอาจจะจำเป็นจะต้องพัฒนาโปรแกรมที่ถูกสร้างขึ้นบน Linux ซึ่งถ้าเราใช้ระบบปฏิบัติการตระกูล Linux ด้วยก็คงจะไม่มีปัญหามากเท่าไหร่ (ถึงจะเป็น Linux ด้วยกันแต่คนละ distribution บางทีก็มีปัญหา) แต่ถ้าระบบปฏิบัติการที่เราใช้เป็น Windows ก็คงจะลำบากพอดู วิธีการแก้ปัญหาแบบง่ายที่สุด ก็คือการลง Linux ใหม่เลย หรือว่าใช้ซอฟต์แวร์ประเภท Virtual Machine ที่จำลองการทำงานของของระบบปฏิบัติการอื่นบน Windows อีกทีหนึ่ง แต่ในวันนี้จะขอเสนอวิธีที่สะดวกกว่านั้นครับ นั่นคือการใช้ Cygwin

Taxonomy upgrade extras: 

Pages

Subscribe to RSS - blogs