ดูเหมือนไม่ว่าใครก็ตามที่ได้เรียนคอมพิวเตอร์ ล้วนจะต้องเจอกับโจทย์ตัวนี้นะครับ นั่นก็คือโจทย์จะตั้งประมาณว่า มียอดเงินอยู่จำนวนหนึ่ง แล้วให้เขียนโปรแกรมเพื่อทำการคัดแยกให้ได้ว่า ยอดเงินดังกล่าวนั้น ควรแบ่งเป็นแบงค์พันกี่ใบ, แบงค์ห้าร้อยกี่ใบ, แบงค์ร้อยกี่ใบ แล้วก็บรา ๆ ๆ ๆ ๆ เป็นต้น
ผ่านมาสิบกว่าปีแล้ว ผมก็ยังเห็นโจทย์ที่ว่าอยู่นะ ที่รู้ว่าโจทย์พวกนี้มันยังมีชีวิตอยู่ ก็เพราะมีเด็กรุ่นใหม่ ๆ ที่มีความรู้และประสบการณ์น้อยกว่าพวกเรา มาตั้งคำถามเหล่านี้อยู่อย่างสม่ำเสมอตามเว็บบอร์ดน่ะครับ
และประเด็นที่ผมสนใจก็คือ ส่วนใหญ่มักไม่มีใครตอบ หรือบางคนก็ตอบมาในลักษณะของโค้ดโปรแกรม อือม ถ้าแบบนี้แล้วจะทำให้เกิดแนวคิดที่ถูกต้องอย่างเป็นขั้นเป็นตอนได้ไงล่ะเนี่ย อีกอย่างผมก็เห็นว่าแนวคิดเหล่านี้ เราควรจะทำให้อยู่ในรูปแบบที่เรียบง่าย ที่ใครก็ตามซึ่งไม่ได้เรียนคอมพิวเตอร์มา ก็สามารถร่วมเข้าใจกับเราด้วยได้ ซึ่งมันน่าจะดีกว่านะ
ว่าแล้วผมก็ตั้งโจทย์ขึ้นมาโจทย์นึงเลยดีกว่า โดยให้นำเสนอแนวคิดเพื่อสั่งให้คอมพิวเตอร์ “ทอนเงิน” ให้กับเรา โดยโจทย์ก็คือจำนวนเงินที่ให้ทอนคือ 5,765.75 บาท (อ่านว่า – ห้าพันเจ็ดร้อยหกสิบห้าบาทเจ็ดสิบห้าสตางค์)
จากนั้นมาลงมือทำกันดีกว่า … โดยเริ่มแรกเราต้องเตะทศนิยมออกไปก่อน จะได้คำนวนง่าย ๆ ดังรูป
จากนั้นก็เริ่มสกัดเอาแบงค์ใหญ่ ๆ ออกมาก่อน โดยวิธีการหารครับ หารเอาส่วนแล้วก็หารเอาเศษง่าย ๆ เนี่ยแหล่ะ
ต่อไปก็คำนวนหาแบงค์เล็กบ้าง อือม ตอนนี้แบงค์สิบบาทมันไม่มีแล้วเน้อะ งั้นก็คงต้องเหมาว่าเหรียญสิบบาทเป็นพวกเดียวกับแบงค์เล็กไปก่อนก็แล้วกัน
สุดท้ายก็สังเคราะห์เอาจำนวนเหรียญกษาปน์ออกมา (ผมไม่ค่อยชอบเศษสตางค์เท่าไหร่ มันหนักกระเป๋า :-P)
รู้สึกผมจะลืมอะไรไป อือม ๆ ๆ ๆ ผมลืมจริง ๆ ด้วย ผมลืมคำนวนเหรียญสตางค์ งั้นเรามาดูดีกว่าว่าจะกระเทาะเอาเหรียญสตางค์ออกมาได้ยังไง
เมื่อถึงตรงนี้เราก็จะได้คำตอบแล้วว่า ยอดเงิน 5,765.75 บาทนั้น เมื่อแตกออกมาเป็นธนบัตรและเหรียญกษาปน์แล้ว เราก็จะได้เป็น …
คำตอบ
- แบงค์พัน = 5 ใบ
- แบงค์ห้าร้อย = 1 ใบ
- แบงค์ร้อย = 2 ใบ,
- แบงค์ห้าสิบ = 1 ใบ
- เหรียญสิบ = 1 เหรียญ
- เหรียญห้า = 1 เหรียญ
- เหรียญห้าสิบตังค์ = 1 เหรียญ
- เหรียญยี่สิบห้าตังค์ = 1 เหรียญ
จะเห็นว่าถ้าเราแสดงแนวคิดแบบนี้ออกมา ไม่ใช่แค่คนเรียนคอมพิวเตอร์ที่มีทักษะทางการโค้ดโปรแกรมจะได้ประโยชน์หรอก เหล่าบรรดาคนที่เป็น advance user ซึ่งมีทักษะในการใช้โปรแกรมจำพวก Excel หรือ Access ก็จะได้ประโยชน์จากการสำแดงแนวคิดแบบนี้ด้วย
การหวังดีที่จะให้ผู้อื่นพยายามเรียนรู้ด้วยตัวเอง อาจทำให้เขาต้องพบกับหนทางที่ตีบตันตลอดชีวิตเลยก็เป็นได้ ดังนั้น ช่วยสำแดงหนทางให้เขาจะดีกว่า ถึงหนทางดังกล่าวมันจะเป็นสิ่งที่เราเห็นว่ามันง่ายแสนง่ายก็ตามที
ป.ล. ผมลืมไปว่าเมืองไทยมันมีเหรียญสองบาทโผล่มาให้ใช้ด้วย แต่แบบว่าขี้เกียจทำรูปภาพใหม่แล้ว ก็ถือซะว่าเมืองไทยมันไม่มีเหรียญสองบาทก็แล้วกัน ฮา 😛
[tags]คอมพิวเตอร์, ซอฟต์แวร์, ทอนเงิน, เงินตรา, สั่งการ, การสร้างซอฟต์แวร์[/tags]
นี่มันคล้าย ๆ ข้อสอบโอลิมปิค คอมพิวเตอร์ตอนผมอยู่ ม.ปลายเลย แต่อันนั้นจะให้เปลี่ยนเป็น เลข Roman XII อะไรทำนองเนี้ย ก็คล้าย ๆ กันนะ
รุ่นผม เค้าบอกให้เขียนเอทีเอ็ม (มีแบงค์หมดได้ด้วย)
แต่คำถามตามเว็บบอร์ดที่ผมเจอ ถ้าผมมีเวลาผมจะตอบแบบพี่ไท้นะครับ
แต่… โลกไม่ได้สวยงามขนาดนั้น
เพราะเจ้าของกระทู้จะมาถามต่อว่า ช่วยเขียนเป็นโค๊ดให้ดูได้หรือเปล่า….
อันนี้มีเซ็ง -_-‘
ถ่ายเอกสารแจกเป็น อัลกอริธึมทอนเงิน Cheat sheet เลยครับ (ฮา)
โอ้ว ถ้าเป็นข้อสอบโอลิมปิคล่ะก็ มหาหินกว่านี้เป็นสิบ ๆ เท่าเลยครับคุณข่า ผมเคยอ่านโจทย์แล้ว ไม่มีปัญญาทำได้ซักข้อเดียว T-T ความโง่ไม่เคยปราณีใครครับ
เออ ไมคุณ patr รู้ล่ะเนี่ย T-T จริง ๆ ด้วยแหล่ะ เนี่ยเมื่อไม่กี่วันมานี้ มีคนอีเมลล์มาขอให้ผมเขียนโค้ดให้ด้วย แต่ผมไม่มีปัญญาทำให้อ่ะ เลยปฏิเสธไป
น่าคิดนะเนี่ยคุณเอ ฮา 😛
ยืนยันว่าข้อสอบโอลิมปิกคอมพิวเตอร์หินจริงๆ ครับ
สมัยผมสอบ เจอโจทย์ว่ากำหนดพิกัด xy ของมุมของรูปหลายเหลี่ยมมาให้ และมีพิกัดของจุดอีกหนึ่งจุด ให้เขียนโปรแกรม solve ว่าจุดนี้อยู่ข้างในหรือข้างนอกรูปหลายเหลี่ยม
โจทย์ดูเหมือนง่ายเลยครับ แต่พอทำจริงโคตรยาก สมัยนั้นใช้ Turbo Pascal เขียน
ลองดูครับไม่รู้ใช้ได้เปล่า c#
double remaining = 0;
double thousand = 0;
double fivehundred = 0;
double onehundred = 0;
double fifty = 0;
double twenty = 0;
double ten = 0;
double five = 0;
double one = 0;
double fiftycent = 0;
double twentyfivecent = 0;
string[] sp = textBox1.Text.Split(‘.’);
thousand = Math.Floor(Convert.ToDouble(sp[0])/Convert.ToDouble(1000));
remaining = Convert.ToDouble(sp[0])%1000;
fivehundred = Math.Floor(remaining/Convert.ToDouble(500));
remaining = remaining%500;
onehundred = Math.Floor(remaining/Convert.ToDouble(100));
remaining = remaining%100;
fifty = Math.Floor(remaining/Convert.ToDouble(50));
remaining = remaining%50;
twenty = Math.Floor(remaining/Convert.ToDouble(20));
remaining = remaining%20;
ten = Math.Floor(remaining/Convert.ToDouble(10));
remaining = remaining%10;
five = Math.Floor(remaining/Convert.ToDouble(5));
remaining = remaining%5;
one = Math.Floor(remaining/Convert.ToDouble(1));
remaining = remaining%1;
if(sp.Length>1)
{
fiftycent = Math.Floor(Convert.ToDouble(sp[1])/Convert.ToDouble(50));
remaining = Convert.ToDouble(sp[1])%50;
twentyfivecent = Math.Floor(remaining/Convert.ToDouble(25));
}
MessageBox.Show
(
“Thousand = “+thousand.ToString()+”\n”+
“Fivehundred = “+fivehundred.ToString()+”\n”+
“Onehundred = “+onehundred.ToString()+”\n”+
“Fifty = “+fifty.ToString()+”\n”+
“Twenty = “+twenty.ToString()+”\n”+
“Ten = “+ten.ToString()+”\n”+
“Five = “+five.ToString()+”\n”+
“One = “+one.ToString()+”\n”+
“Fiftycent = “+fiftycent.ToString()+”\n”+
“Twentyfivecent = “+twentyfivecent.ToString()+”\n”
);