กี่วันในเดือนพฤษภาคม การกำหนดจำนวนวันในหนึ่งเดือนใน Microsoft Excel การคำนวณจำนวนวันระหว่างวันที่
เมื่อเร็ว ๆ นี้หลังจากไม่ได้นอนเป็นเวลานาน ฉันคิดว่าคุณจะรู้จำนวนวันในหนึ่งเดือนได้อย่างไรโดยรู้จำนวนวันของมัน มีเพลงกล่อมเด็กในหัวข้อนี้มีวิธีนับด้วยข้อนิ้ว แต่วิธีการเหล่านี้ไม่เหมาะกับฉัน - ฉันรีบค้นหาสูตรทางคณิตศาสตร์ซึ่งฉันได้รับหลังจากนั้นครู่หนึ่ง
ดังนั้นภารกิจ
กล่าวอีกนัยหนึ่งเราต้องได้รับฟังก์ชัน f (x) ที่จะให้รายการค่าต่อไปนี้ (ซึ่งโดยวิธีการที่ฉันพบที่ไหนสักแห่งบนอินเทอร์เน็ตและไม่ได้อนุมานโดยใช้กฎช่วยในการจำ):
ควรสังเกตว่าเป็นอาร์กิวเมนต์ที่เราได้รับเฉพาะจำนวนเดือนนั่นคือ เราไม่นับปีอธิกสุรทินและ ฉ (2) = 28.
หากคุณต้องการทราบผลลัพธ์ที่ฉันได้รับ ให้เลื่อนไปที่ด้านล่างของหน้านี้ สิ่งที่จะอธิบายด้านล่างนี้คือที่มาของสูตรที่ต้องการ
เราจะใช้อะไร
นอกจากการบวก การลบ และการคูณ ฉันจะใช้การดำเนินการสองอย่าง: การหารจำนวนเต็มและเศษเหลือ ฉันขอเตือนคุณว่ามันคืออะไร:
- หารจำนวนเต็มหรือ "หารแล้วปัดเศษ" ฉันจะแสดงเป็นส่วนปกติ: a / b - หมายถึง ⌊a / b⌋ ตัวอย่างเช่น 5/3 = 1
- นำโมดูโลที่เหลือมา... ฉันจะแสดงถึงการหารแบบดั้งเดิมด้วยเศษ: a% b = a - (a / b) * b ตัวอย่างเช่น 5% 3 = 2
พวกเขามีลำดับความสำคัญเท่ากันและถูกปล่อยให้เชื่อมโยงกัน
พื้นฐานหรือกฎที่มีข้อยกเว้นมากมาย
ลองหารูปแบบที่จะตอบสนองค่าของการโต้แย้งให้ได้มากที่สุด โดยปกติจำนวนวันในหนึ่งเดือนจะผันผวนระหว่าง 30 ถึง 31 ในเวลาเดียวกัน คุณสามารถสังเกตเห็นการพึ่งพาของตัวเลขนี้บนความเท่าเทียมกันของเดือน - ดังนั้น เราจะใช้การดำเนินการของการรับโมดูโล 2 ที่เหลือ ดูเหมือนว่าควรเป็นดังนี้:
f₁ (x) = 30 + x% 2
เริ่มดี! เพิกเฉยในเดือนกุมภาพันธ์ซึ่งแน่นอนว่าจะต้องมีเล่ห์เหลี่ยมอยู่บ้าง เราดีใจที่เราสามารถปรับฟังก์ชันสำหรับครึ่งปีแรกได้ จากนั้นในเดือนสิงหาคม ความเท่าเทียมกันจะต้องเปลี่ยนไปในทางตรงข้าม สามารถทำได้โดยเปลี่ยน x% 2ในรุ่นแรกของสูตร on (x + 1)% 2:
f₂ (x) = 30 + (x + 1)% 2
ตามที่คาดไว้ ตอนนี้ครึ่งแรกของปีอยู่นอกช่วงของค่าที่ถูกต้องแล้ว แต่เดือนตั้งแต่เดือนสิงหาคมถึงธันวาคมได้ให้สิ่งที่เราต้องการ ลองหาวิธีรวมสองส่วนนี้เข้าด้วยกัน
หน้ากาก
เราต้องการ +1 ในเงินปันผลเพื่อ "เปิดใช้งาน" เฉพาะเมื่ออาร์กิวเมนต์ถึงค่าที่มากกว่า 8 นั่นคือ เราจำเป็นต้องทาหน้ากาก ในกรณีนี้ ค่าของอาร์กิวเมนต์ต้องไม่เกิน 12 ดังนั้น การหารจำนวนเต็มของอาร์กิวเมนต์ด้วย 8 จึงเหมาะอย่างยิ่งสำหรับเรา:
ตรงตามที่เราต้องการ ลองใช้ข้อสรุปนี้:
f₃ (x) = 30 + (x + x / 8)% 2
ว้าว! ทุกอย่างถูกต้อง ยกเว้นเดือนกุมภาพันธ์ อย่างคาดไม่ถึง
กุมภาพันธ์
ทุกเดือนมี 30 หรือ 31 วันในเดือนกุมภาพันธ์ - 28 (จำไว้ว่าเราไม่พิจารณาปีอธิกสุรทิน)
ข้อมูลอ้างอิงทางประวัติศาสตร์: ในปฏิทินโรมัน กุมภาพันธ์เป็นเดือนสุดท้ายของปี - คุณต้องยอมรับว่าการเพิ่มวันในปีอธิกสุรทินต่อท้ายปฏิทินนั้นง่ายกว่า อย่างไรก็ตาม เราใช้ปฏิทินเกรกอเรียนซึ่งเดือนที่สั้นที่สุดจะถูกย้ายเข้ามาใกล้จุดเริ่มต้นมากขึ้นตามเจตจำนงของผู้ปกครองที่ฉลาดท่านหนึ่ง
มากที่สุด รุ่นล่าสุดสูตรของเรามี 30 วันในเดือนกุมภาพันธ์ ดังนั้นเราจึงต้องตัดขาดจากเขาสองสามวัน แน่นอน อีกหลายเดือนจะต้องทนทุกข์ทรมานจากสิ่งนี้ ไม่ว่าจะเป็นด้านซ้ายของเดือนกุมภาพันธ์หรือทางด้านขวาในรายการของเรา อย่างไรก็ตาม ทางขวาของเดือนนั้นมีน้อยกว่ามาก ดังนั้นเราจะต้องเสียสละในเดือนมกราคม แล้วจึงปรับสูตร สำหรับมัน. คุณสามารถตัดวันที่สำหรับเดือนแรกและเดือนที่สองโดยใช้นิพจน์ 2% x.
บันทึก: โพสต์นี้เป็นคำแปลของบทความ cmcenroe.me/2014/12/05/days-in-month-formula.html ( ส่วนที่ 1) เช่นเดียวกับการเพิ่มของผู้เขียน ( ส่วนที่II). คุณไม่ควรจริงจังกับเนื้อหานี้ แต่เป็นการวอร์มอัพสำหรับจิตใจ ไม่ต้องการอะไรมากไปกว่าความรู้ทางคณิตศาสตร์ของโรงเรียนและไม่มีการนำไปใช้จริง มีความสุขในการอ่านทุกคน!
ส่วนที่ 1
บทนำ
เมื่อเร็ว ๆ นี้หลังจากนอนไม่หลับอีกคืนหนึ่ง ฉันกำลังคิดเกี่ยวกับวิธีการจำจำนวนวันในแต่ละเดือนของปี สำหรับสิ่งนี้มีเครื่องนับเช่นเดียวกับวิธีการนับบนสนับมือ แต่ก็ไม่มีใครเหมาะกับฉัน ฉันสงสัยว่ามีสูตรทางคณิตศาสตร์บางประเภทสำหรับการแก้ปัญหาดังกล่าวหรือไม่ และ - ไม่พบสูตรที่มีการศึกษาคร่าวๆ - ฉันท้าทายตัวเองให้สร้างมันขึ้นมาการจัดรูปแบบ กล่าวอีกนัยหนึ่ง จำเป็นต้องค้นหาฟังก์ชัน NSเพื่อให้ค่า ฉ (x)ทุกเดือน NSซึ่งแสดงด้วยตัวเลขระหว่าง 1 ถึง 12 เท่ากับจำนวนวันในเดือนนั้น ตารางค่าอาร์กิวเมนต์และฟังก์ชัน:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
หากคุณมีความปรารถนาที่จะลองด้วยตัวเองก่อนที่จะอ่านวิธีแก้ปัญหาของฉัน ตอนนี้ก็ถึงเวลาแล้ว หากคุณต้องการดูคำตอบสำเร็จรูปทันที ให้ดูที่สปอยเลอร์
ตอบ
ด้านล่างนี้คือขั้นตอนของฉันในการค้นหาวิธีแก้ไข
เครื่องมือทางคณิตศาสตร์
อันดับแรก เรามารีเฟรชหน่วยความจำของเราอย่างรวดเร็วเกี่ยวกับตัวดำเนินการที่สำคัญสองตัวในการแก้ปัญหานี้: การหารจำนวนเต็มและส่วนที่เหลือของการหารหารจำนวนเต็มเป็นโอเปอเรเตอร์ที่ใช้ในภาษาโปรแกรมหลายภาษาเมื่อทำการหารจำนวนเต็มสองจำนวนและละทิ้งส่วนที่เป็นเศษส่วนออกจากผลหาร ฉันจะพรรณนาเขาเป็น ตัวอย่างเช่น:
ส่วนที่เหลือของดิวิชั่นมันคือตัวดำเนินการที่หาส่วนที่เหลือของดิวิชั่น ภาษาโปรแกรมหลายภาษาใช้สัญลักษณ์ %
แต่ฉันจะใช้โครงสร้างของแบบฟอร์ม เช่น
โปรดทราบว่าส่วนที่เหลือของแผนกมีลำดับความสำคัญเท่ากับส่วน
พื้นฐาน
ลองใช้เครื่องมือทางคณิตศาสตร์ของเราเพื่อให้ได้สูตรพื้นฐาน ในเดือนปกติมี 30 หรือ 31 วัน เราจึงสามารถใช้ 1 หรือ 0 เพื่อสลับกัน แล้วเพิ่มค่าคงที่ให้กับตัวเลขนี้:เราได้ตารางค่าที่ถูกต้องจะถูกเน้นด้วยตัวหนา:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 |
เริ่มดี! มีค่าที่ถูกต้องอยู่แล้วสำหรับมกราคมและสำหรับเดือนมีนาคมถึงกรกฎาคมรวมอยู่ด้วย กุมภาพันธ์เป็นกรณีพิเศษ และเราจะจัดการกับมันในภายหลัง หลังจากเดือนกรกฎาคม สำหรับเดือนที่เหลือ ลำดับของการรับ 0 และ 1 จะต้องถูกกลับรายการ
ในการทำเช่นนี้ เราสามารถบวก 1 เข้ากับเงินปันผลได้:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 |
ตอนนี้ค่าที่ถูกต้องคือตั้งแต่เดือนสิงหาคมถึงธันวาคม แต่ตามที่คาดไว้ ค่าสำหรับเดือนอื่นๆ ไม่ถูกต้อง เรามาดูกันว่าเราจะรวมสูตรเหล่านี้ได้อย่างไร
มาส์กโอเวอร์เลย์
สิ่งนี้ต้องใช้ฟังก์ชันที่กำหนดเป็นชิ้นๆ แต่ - เนื่องจากมันดูน่าเบื่อสำหรับฉัน - ฉันคิดถึงวิธีแก้ปัญหาอื่น โดยใช้ส่วนหนึ่งของฟังก์ชันในช่วงเวลาหนึ่ง กับอีกช่วงหนึ่งฉันคิดว่ามันง่ายที่สุดในการค้นหานิพจน์ที่เท่ากับ 1 ในแอปพลิเคชันเดียวและ 0 ในแอปพลิเคชันที่เหลือ วิธีการที่เราแยกอาร์กิวเมนต์ด้วยนิพจน์ในการคูณอาร์กิวเมนต์นั้นออกจากสูตรที่อยู่นอกขอบเขตของแอปพลิเคชัน ฉันเรียกว่า "การกำบัง" เพราะพฤติกรรมนี้คล้ายกับบิตมาสก์บางประเภท
หากต้องการใช้วิธีนี้ในส่วนสุดท้ายของฟังก์ชัน คุณต้องค้นหานิพจน์ที่เท่ากับ 1 สำหรับ และ - เนื่องจากค่าอาร์กิวเมนต์จะน้อยกว่า 16 เสมอ การหารจำนวนเต็มด้วย 8 จึงใช้ได้
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
⌊ NS ⁄ 8 ⌋ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
ทีนี้ โดยใช้มาสก์นี้ โดยใช้นิพจน์แทน 1 ในการปันผล เราสามารถแทนที่ลำดับของการได้ 0 และ 1 ของสูตรด้วยค่าที่ตรงกันข้าม:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ยูเรก้า! ทุกอย่างถูกต้อง ยกเว้นเดือนกุมภาพันธ์ เซอร์ไพรส์.
กุมภาพันธ์
เดือนใดๆ มี 30 หรือ 31 วัน ยกเว้นเดือนกุมภาพันธ์กับวันที่ 28 (ปีอธิกสุรทินอยู่นอกเหนือขอบเขตของปัญหานี้) ในขณะนี้ ตามสูตรของเรา มันมี 30 วัน ดังนั้น คงจะดีถ้าลบนิพจน์เท่ากับ 2 atสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือสิ่งนี้ซึ่งสวมหน้ากากทุกเดือนหลังจากเดือนกุมภาพันธ์:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2 mod NS | 0 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
เปลี่ยนค่าคงที่ฐานเป็น 28 บวก 2 ในเดือนที่เหลือ เราได้สูตร:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 29 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ขออภัย ขณะนี้เดือนมกราคมสั้นลง 2 วัน โชคดีที่มันง่ายที่จะได้รับนิพจน์ที่ใช้กับเดือนแรกเท่านั้น นั่นคือค่าผกผันของตัวเลขที่ปัดเศษลง คูณด้วย 2 เราจะได้สูตรสุดท้าย:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
Afterword
นี่คือ - สูตรการหาจำนวนวันในเดือนใดๆ ของปี โดยใช้เลขคณิตที่ง่ายที่สุด ครั้งต่อไปที่คุณนึกถึงจำนวนวันในเดือนกันยายน ให้ทำเช่นนี้ด้วยฟังก์ชัน JavaScript แบบบรรทัดเดียว:ฟังก์ชัน f (x) (ส่งคืน 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)
ส่วนที่II
บทนำ
ในส่วนแรกได้สูตรที่สั้นและสง่างามเล็กน้อย ข้อดีหลักคือความเรียบง่ายของอุปกรณ์ทางคณิตศาสตร์ การไม่มีกิ่งก้านและนิพจน์เงื่อนไข และความกะทัดรัด ข้อเสีย - นอกเหนือจากความจริงที่ว่าคุณจะไม่ใช้ในโครงการของคุณ - รวมถึงการขาดการตรวจสอบสำหรับ viscoconut และปีที่ไม่ใช่ปีอธิกสุรทินดังนั้นฉันจึงกำหนดภารกิจในการสร้างฟังก์ชัน NSเพื่อให้ค่า ฉ (x, y)ทุกเดือน NSแทนด้วยตัวเลขตั้งแต่ 1 ถึง 12 และหนึ่งปี yมากกว่า 0 เท่ากับจำนวนวันในหนึ่งเดือน NSในปีนี้ y.
สำหรับคนใจร้อนมีคำตอบใต้สปอยนะครับ ส่วนคนที่เหลือขอให้ติดตามครับ
ตอบ
ส่วนที่เหลือของแผนก: modและ ⌊⌋
เพื่อความชัดเจนของภาพ ให้ตกลงกันว่าในบางสูตร ตัวดำเนินการหารด้วยเศษเหลือจะถูกแทนที่ด้วยวงเล็บล่าง ซึ่งดูเหมือนว่าจำเป็นสำหรับฉัน:ปีอธิกสุรทิน
ในปีอธิกสุรทิน จะมีวันเพิ่มตามปฏิทิน: 29 กุมภาพันธ์ อย่างที่คุณทราบ ปีอธิกสุรทินคือผลคูณของ 4 และไม่ใช่ผลคูณของ 100 หรือผลคูณของ 400 มาเขียนนิพจน์ที่เหมือนกับข้อความนี้กัน:ในการแปลงนิพจน์นี้เป็นนิพจน์เกี่ยวกับพีชคณิต จำเป็นต้องใช้การฉีดแบบฟอร์มกับผลลัพธ์ของนิพจน์:
ซึ่งจะทำให้คุณได้ 1 เมื่อหารไม่มีเศษและ 0 เมื่อหารด้วยเศษเหลือเพื่อใช้ในสูตรการกำหนดจำนวนวันในหนึ่งเดือน
เป็นหน้าที่ NS "คุณสามารถใช้ 1 ลบเศษเหลือสำหรับ:
NS | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
กรัม "(x) | อินฟินิตี้ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
เป็นเรื่องง่ายที่จะเห็นว่าการเพิ่มเงินปันผลและตัวหารด้วย 1 ทำให้เราได้สูตรที่ถูกต้องสำหรับ:
NS | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
กรัม "(x) | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ดังนั้นเราจึงเขียนนิพจน์เป็น:
และเราเขียนนิพจน์เป็น:
เมื่อใช้วิธีนี้เราจะได้ฟังก์ชันดังต่อไปนี้ กรัม (y)ค่าที่จะเป็น 1 ถ้าปีเป็นปีอธิกสุรทิน หรือ 0 อย่างอื่น:
y | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 |
---|---|---|---|---|---|---|---|---|---|---|---|
กรัม (y) | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
y | 2000 | 2100 | 2200 | 2300 | 2400 | 2500 | 2600 | 2700 | 2800 | 2900 | 3000 |
กรัม (y) | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
ปีอธิกสุรทินเป็นตัวหนา
ฉันขอเตือนคุณว่าภายในกรอบของข้อตกลงที่ยอมรับ ผู้ดำเนินการรับส่วนที่เหลือของแผนกสามารถแสดงเป็น modและ ⌊⌋.
มาส์กโอเวอร์เลย์
ในสูตรส่วนที่เป็นการแก้ไขเพิ่ม 2 วันในเดือนมกราคม หากเราลบตัวประกอบของ 2 และแทนที่ 1 ด้วย 2 ในตัวเศษ สูตรนี้จะเพิ่ม 2 วันในเดือนมกราคม และ 1 วันเป็นเดือนกุมภาพันธ์ ซึ่งจะทำให้เราเพิ่มวันในปีอธิกสุรทินได้ เพื่อความชัดเจน เราใช้ค่ากลางในสูตร กรัม (y)และเช่น yเราใช้ปี 2000 (อธิกสุรทิน) และปี 2544 (ไม่ใช่ปีอธิกสุรทิน):NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x, 2000) | 31 | 29 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ฉ (x, 2001) | 30 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 30 |
ค่าของทุกเดือนยกเว้นเดือนมกราคมของปีที่ไม่ใช่ปีอธิกสุรทินนั้นถูกต้อง
เพื่อแก้ไขความเข้าใจผิดที่น่ารำคาญนี้ ให้เพิ่ม 1 วันถึงเดือนมกราคมด้วยสูตรที่เรารู้อยู่แล้ว:
หรือ:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x, 2000) | 31 | 29 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ฉ (x, 2001) | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 30 |
บทสรุป
เป็นผลให้ยุ่งยากมากขึ้น แต่ได้สูตรสากลมากขึ้นซึ่งสามารถใช้เพื่อรับจำนวนวันในเดือนของปีหนึ่ง:ฟังก์ชัน f (x, y) (ส่งคืน 28 + ((x + Math.floor (x / 8))% 2) + 2% x + Math.floor ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
ตัวอย่างในภาษา C # ideone.com/fANutz
1
... ฉันไม่รู้วิธีใช้ตัวช่วยจำ ดังนั้นฉันจึงแอบดูป้ายบนอินเทอร์เน็ต
2
... "พื้นฐาน" หรือ "กฎที่มีข้อยกเว้นมากมาย" เช่นเดียวกับกฎส่วนใหญ่
3
... ในขั้นต้น กุมภาพันธ์เป็นเดือนสุดท้ายของปีในปฏิทินโรมัน ดังนั้นจึงมีเหตุผลที่สั้นกว่าเดือนอื่นๆ นอกจากนี้ยังมีตรรกะในการเพิ่มหรือลบวันเมื่อสิ้นปี ดังนั้นความยาวจึงแปรผันได้
อัปเดต 1:
การแปลอื่นของส่วนแรกใน
ในการแก้ปัญหาบางอย่างเมื่อสร้างตาราง คุณต้องระบุจำนวนวันในหนึ่งเดือนในเซลล์ที่แยกจากกันหรือภายในสูตร เพื่อให้โปรแกรมสามารถดำเนินการคำนวณที่จำเป็นได้ Excel มีเครื่องมือสำหรับดำเนินการนี้ มาพิจารณากัน วิธีทางที่แตกต่างการประยุกต์ใช้โอกาสนี้
คุณสามารถคำนวณจำนวนวันในหนึ่งเดือนใน Excel โดยใช้ตัวดำเนินการหมวดหมู่พิเศษ "วันและเวลา"... หากต้องการทราบว่าตัวเลือกใดเหมาะสมที่สุด คุณต้องกำหนดเป้าหมายของการดำเนินการก่อน ทั้งนี้ขึ้นอยู่กับสิ่งนี้ ผลลัพธ์ของการคำนวณสามารถแสดงเป็นองค์ประกอบแยกต่างหากบนแผ่นงาน หรือสามารถใช้ในสูตรอื่นได้
วิธีที่ 1: การรวมกันของตัวดำเนินการ DAY และ EONMONTH
ที่สุด ด้วยวิธีง่ายๆเพื่อแก้ปัญหานี้คือการรวมกันของตัวดำเนินการ วันและ แห่งยุค.
การทำงาน วันอยู่ในกลุ่มโอเปอเรเตอร์ "วันและเวลา"... เธอชี้ไปที่หมายเลขเฉพาะจาก 1 ก่อน 31 ... ในกรณีของเรา งานของโอเปอเรเตอร์นี้คือการบ่งชี้ วันสุดท้ายเดือนโดยใช้ฟังก์ชันในตัวเป็นอาร์กิวเมนต์ แห่งยุค.
ไวยากรณ์ตัวดำเนินการ วันต่อไป:
วัน (date_num_format)
นั่นคืออาร์กิวเมนต์เดียวของฟังก์ชันนี้คือ "วันที่ในรูปแบบตัวเลข"... จะถูกตั้งค่าโดยโอเปอเรเตอร์ แห่งยุค... ต้องบอกว่าวันที่ในรูปแบบตัวเลขแตกต่างจากรูปแบบปกติ ตัวอย่างเช่นวันที่ 04.05.2017 ตัวเลขจะมีลักษณะเช่น 42859 ... ดังนั้น Excel จึงใช้รูปแบบนี้สำหรับการดำเนินการภายในเท่านั้น ไม่ค่อยได้ใช้เพื่อแสดงในเซลล์
โอเปอเรเตอร์ แห่งยุคมีวัตถุประสงค์เพื่อระบุเลขลำดับของวันสุดท้ายของเดือน ซึ่งเป็นจำนวนเดือนที่ระบุไปข้างหน้าหรือย้อนกลับจากวันที่ระบุ ไวยากรณ์ของฟังก์ชันมีดังนี้:
EON MONTHS (วันที่เริ่มต้น num_months)
โอเปอเรเตอร์ "วันที่เริ่มต้น"มีวันที่ที่ทำการนับถอยหลังหรือการอ้างอิงไปยังเซลล์ที่มันตั้งอยู่
โอเปอเรเตอร์ "จำนวนเดือน"ระบุจำนวนเดือนที่จะนับจากวันที่ที่กำหนด
ตอนนี้เรามาดูกันว่ามันทำงานอย่างไรกับตัวอย่างเฉพาะ เมื่อต้องการทำสิ่งนี้ ให้นำแผ่นงาน Excel มาใส่ในเซลล์หนึ่งที่มีการจารึกหมายเลขปฏิทินไว้ จำเป็นต้องใช้โอเปอเรเตอร์ชุดด้านบนเพื่อกำหนดจำนวนวันในรอบเดือนที่ตัวเลขนี้อ้างอิง
สูตรทั่วไปของเรามีรูปแบบดังต่อไปนี้:
วัน (EONTHS (B3,0))
ในสูตรนี้ ค่าตัวแปรเป็นเพียงที่อยู่ของเซลล์ ( B3). ดังนั้นหากคุณไม่ต้องการดำเนินการตามขั้นตอนด้วย ตัวช่วยสร้างฟังก์ชันคุณสามารถแทรกสูตรนี้ลงในองค์ประกอบใดๆ ของแผ่นงานได้โดยเพียงแค่แทนที่ที่อยู่ของเซลล์ที่มีตัวเลขด้วยที่อยู่ที่เกี่ยวข้องในกรณีเฉพาะของคุณ ผลลัพธ์จะคล้ายกัน
วิธีที่ 2: การกำหนดจำนวนวันโดยอัตโนมัติ
ทีนี้มาดูปัญหาอื่นกัน จำเป็นต้องแสดงจำนวนวันไม่ใช่ตามวันที่ในปฏิทินที่กำหนด แต่แสดงตามวันที่ปัจจุบัน นอกจากนี้ การเปลี่ยนแปลงของช่วงเวลาจะทำโดยอัตโนมัติโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ แม้ว่าจะดูแปลก แต่งานนี้ง่ายกว่าก่อนหน้านี้ แก้ได้แม้เปิด ตัวช่วยสร้างฟังก์ชันไม่จำเป็นเพราะสูตรที่ดำเนินการนี้ไม่มีค่าตัวแปรหรือการอ้างอิงเซลล์ คุณสามารถใส่สูตรต่อไปนี้ลงในเซลล์ของแผ่นงานที่คุณต้องการให้แสดงผลลัพธ์โดยไม่มีการเปลี่ยนแปลง:
วัน (E-MONTHS (วันนี้ (); 0))
ฟังก์ชัน TODAY ในตัวที่เราใช้ในกรณีนี้จะแสดงตัวเลขของวันนี้และไม่มีอาร์กิวเมนต์ ดังนั้น เซลล์ของคุณจะแสดงจำนวนวันในเดือนปัจจุบันอย่างต่อเนื่อง
วิธีที่ 3: คำนวณจำนวนวันที่จะใช้ในสูตรที่ซับซ้อน
ในตัวอย่างข้างต้น เราได้แสดงวิธีการคำนวณจำนวนวันในหนึ่งเดือนสำหรับวันที่ในปฏิทินที่ระบุ หรือโดยอัตโนมัติสำหรับเดือนปัจจุบันด้วยผลลัพธ์ในเซลล์ที่แยกจากกัน แต่อาจจำเป็นต้องหาค่านี้เพื่อคำนวณอินดิเคเตอร์อื่นๆ ในกรณีนี้ การคำนวณจำนวนวันจะดำเนินการในสูตรที่ซับซ้อนและจะไม่แสดงในเซลล์ที่แยกจากกัน ลองดูวิธีการทำกับตัวอย่าง
เราต้องทำให้เซลล์แสดงจำนวนวันที่เหลือจนถึงสิ้นเดือนปัจจุบัน เช่นเดียวกับวิธีก่อนหน้า ตัวเลือกนี้ไม่จำเป็นต้องเปิด ตัวช่วยสร้างฟังก์ชัน... คุณเพียงแค่พิมพ์นิพจน์ต่อไปนี้ลงในเซลล์:
DAY (E-MONTHS (วันนี้ (); 0)) - DAY (วันนี้ ())
หลังจากนั้น จำนวนวันจนถึงสิ้นเดือนจะแสดงในเซลล์ที่ระบุ ทุกวัน ผลลัพธ์จะอัปเดตโดยอัตโนมัติ และตั้งแต่เริ่มต้นช่วงเวลาใหม่ การนับถอยหลังจะเริ่มขึ้นใหม่ มันกลับกลายเป็นตัวจับเวลาถอยหลังชนิดหนึ่ง
อย่างที่คุณเห็น สูตรนี้ประกอบด้วยสองส่วน อย่างแรกคือนิพจน์ที่คุ้นเคยสำหรับการคำนวณจำนวนวันในหนึ่งเดือน:
วัน (E-MONTHS (วันนี้ (); 0))
แต่ในส่วนที่สอง ตัวเลขของวันนี้ถูกลบออกจากตัวบ่งชี้นี้:
วันต่อวัน ())
ดังนั้น เมื่อทำการคำนวณนี้ สูตรสำหรับคำนวณจำนวนวันจึงเป็นส่วนหนึ่งของสูตรที่ซับซ้อนมากขึ้น
วิธีที่ 4: สูตรทางเลือก
แต่น่าเสียดายที่เวอร์ชันของโปรแกรมที่เก่ากว่า Excel 2007 ไม่มีโอเปอเรเตอร์ แห่งยุค... แล้วผู้ใช้ที่ใช้แอปพลิเคชั่นเวอร์ชันเก่าล่ะ? สำหรับพวกเขา โอกาสนี้เกิดขึ้นได้จากอีกสูตรหนึ่ง ซึ่งมากกว่าสูตรที่อธิบายข้างต้น มาดูวิธีการคำนวณจำนวนวันในหนึ่งเดือนสำหรับวันที่ในปฏิทินที่ระบุโดยใช้ตัวเลือกนี้
- เลือกเซลล์สำหรับแสดงผลและไปที่หน้าต่างอาร์กิวเมนต์ตัวดำเนินการ วันในแบบที่เราคุ้นเคยอยู่แล้ว วางเคอร์เซอร์ในช่องเดียวของหน้าต่างนี้ และคลิกที่สามเหลี่ยมคว่ำทางด้านซ้ายของแถบสูตร ไปที่ส่วน "หน้าที่อื่น ๆ ... ".
- ในหน้าต่าง ตัวช่วยสร้างฟังก์ชันในกลุ่ม "วันและเวลา"เน้นชื่อ "วันที่"และคลิกที่ปุ่ม "ตกลง".
- หน้าต่างตัวดำเนินการเริ่มต้นขึ้น วันที่. ฟังก์ชั่นนี้แปลงวันที่จากรูปแบบปกติเป็นค่าตัวเลข ซึ่งผู้ดำเนินการจะต้องดำเนินการ วัน.
หน้าต่างที่เปิดขึ้นมีสามช่อง ในสนาม "วัน"คุณสามารถป้อนหมายเลขได้ทันที "1"... การดำเนินการนี้จะเหมือนกันในทุกสถานการณ์ แต่อีกสองฟิลด์จะต้องได้รับการจัดการอย่างถี่ถ้วน
วางเคอร์เซอร์ในฟิลด์ "ปี"... ต่อไปเราจะเลือกตัวดำเนินการผ่านรูปสามเหลี่ยมที่คุ้นเคย
- ทั้งหมดในหมวดเดียวกัน ตัวช่วยสร้างฟังก์ชันเน้นชื่อ "ปี"และคลิกที่ปุ่ม "ตกลง".
- หน้าต่างอาร์กิวเมนต์ตัวดำเนินการเริ่มต้น ปี... กำหนดปีตามวันที่ระบุ ในกล่องหน้าต่างเดียว "วันที่ในรูปแบบตัวเลข"เราระบุลิงก์ไปยังเซลล์ที่มีวันที่เดิมที่คุณต้องการกำหนดจำนวนวัน หลังจากนั้นอย่ารีบคลิกที่ปุ่ม "ตกลง"และคลิกที่ชื่อ "วันที่"บนแถบสูตร
- จากนั้นเรากลับไปที่หน้าต่างอาร์กิวเมนต์อีกครั้ง วันที่... วางเคอร์เซอร์ในช่อง "เดือน"และไปเลือกฟังค์ชั่นต่างๆ
- วี ตัวช่วยสร้างฟังก์ชันคลิกที่ชื่อ "เดือน"และคลิกที่ปุ่ม "ตกลง".
- หน้าต่างอาร์กิวเมนต์ของฟังก์ชันเริ่มทำงาน เดือน... งานคล้ายกับตัวดำเนินการก่อนหน้าเพียงแสดงค่าของหมายเลขเดือน ในช่องเดียวของหน้าต่างนี้ ให้ตั้งค่าการอ้างอิงเดียวกันกับหมายเลขเดิม จากนั้นในแถบสูตร ให้คลิกที่ชื่อ "วัน".
- กลับไปที่หน้าต่างอาร์กิวเมนต์ วัน... ที่นี่เราต้องทำจังหวะเล็ก ๆ เพียงครั้งเดียว ในช่องเดียวของหน้าต่างซึ่งมีข้อมูลอยู่แล้ว ให้เพิ่มนิพจน์ต่อท้ายสูตร "-1"โดยไม่ต้องใส่เครื่องหมายอัญประกาศ และใส่ "+1" หลังโอเปอเรเตอร์ด้วย เดือน... หลังจากนั้นคลิกที่ปุ่ม "ตกลง".
- ดังที่คุณเห็น เซลล์ที่เลือกไว้ล่วงหน้าจะแสดงจำนวนวันในเดือนที่มีหมายเลขที่ระบุ สูตรทั่วไปมีลักษณะดังนี้:
วัน (DATE (YEAR (D3); MONTH (D3) +1; 1) -1)
ความลับของสูตรนี้ง่ายมาก เราใช้เพื่อกำหนดวันที่ของวันแรกของรอบระยะเวลาถัดไป จากนั้นลบหนึ่งวันจากนั้นหาจำนวนวันในเดือนที่ระบุ ตัวแปรในสูตรนี้คือการอ้างอิงเซลล์ D3ในสองแห่ง หากคุณแทนที่ด้วยที่อยู่ของเซลล์ที่มีวันที่ในกรณีของคุณโดยเฉพาะ คุณสามารถขับนิพจน์นี้ไปยังองค์ประกอบใดก็ได้ในชีตโดยไม่ต้องใช้ความช่วยเหลือ ตัวช่วยสร้างฟังก์ชัน.
อย่างที่คุณเห็น มีหลายตัวเลือกในการค้นหาจำนวนวันในหนึ่งเดือนใน Excel อันไหนที่จะใช้ขึ้นอยู่กับเป้าหมายปลายทางของผู้ใช้ตลอดจนรุ่นของโปรแกรมที่เขาใช้
บันทึก: โพสต์นี้เป็นคำแปลของบทความ cmcenroe.me/2014/12/05/days-in-month-formula.html ( ส่วนที่ 1) เช่นเดียวกับการเพิ่มของผู้เขียน ( ส่วนที่II). คุณไม่ควรจริงจังกับเนื้อหานี้ แต่เป็นการวอร์มอัพสำหรับจิตใจ ไม่ต้องการอะไรมากไปกว่าความรู้ทางคณิตศาสตร์ของโรงเรียนและไม่มีการนำไปใช้จริง มีความสุขในการอ่านทุกคน!
ส่วนที่ 1
บทนำ
เมื่อเร็ว ๆ นี้หลังจากนอนไม่หลับอีกคืนหนึ่ง ฉันกำลังคิดเกี่ยวกับวิธีการจำจำนวนวันในแต่ละเดือนของปี สำหรับสิ่งนี้มีเครื่องนับเช่นเดียวกับวิธีการนับบนสนับมือ แต่ก็ไม่มีใครเหมาะกับฉัน ฉันสงสัยว่ามีสูตรทางคณิตศาสตร์บางประเภทสำหรับการแก้ปัญหาดังกล่าวหรือไม่ และ - ไม่พบสูตรที่มีการศึกษาคร่าวๆ - ฉันท้าทายตัวเองให้สร้างมันขึ้นมาการจัดรูปแบบ กล่าวอีกนัยหนึ่ง จำเป็นต้องค้นหาฟังก์ชัน NSเพื่อให้ค่า ฉ (x)ทุกเดือน NSซึ่งแสดงด้วยตัวเลขระหว่าง 1 ถึง 12 เท่ากับจำนวนวันในเดือนนั้น ตารางค่าอาร์กิวเมนต์และฟังก์ชัน:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
หากคุณมีความปรารถนาที่จะลองด้วยตัวเองก่อนที่จะอ่านวิธีแก้ปัญหาของฉัน ตอนนี้ก็ถึงเวลาแล้ว หากคุณต้องการดูคำตอบสำเร็จรูปทันที ให้ดูที่สปอยเลอร์
ตอบ
ด้านล่างนี้คือขั้นตอนของฉันในการค้นหาวิธีแก้ไข
เครื่องมือทางคณิตศาสตร์
อันดับแรก เรามารีเฟรชหน่วยความจำของเราอย่างรวดเร็วเกี่ยวกับตัวดำเนินการที่สำคัญสองตัวในการแก้ปัญหานี้: การหารจำนวนเต็มและส่วนที่เหลือของการหารหารจำนวนเต็มเป็นโอเปอเรเตอร์ที่ใช้ในภาษาโปรแกรมหลายภาษาเมื่อทำการหารจำนวนเต็มสองจำนวนและละทิ้งส่วนที่เป็นเศษส่วนออกจากผลหาร ฉันจะพรรณนาเขาเป็น ตัวอย่างเช่น:
ส่วนที่เหลือของดิวิชั่นมันคือตัวดำเนินการที่หาส่วนที่เหลือของดิวิชั่น ภาษาโปรแกรมหลายภาษาใช้สัญลักษณ์ %
แต่ฉันจะใช้โครงสร้างของแบบฟอร์ม เช่น
โปรดทราบว่าส่วนที่เหลือของแผนกมีลำดับความสำคัญเท่ากับส่วน
พื้นฐาน
ลองใช้เครื่องมือทางคณิตศาสตร์ของเราเพื่อให้ได้สูตรพื้นฐาน ในเดือนปกติมี 30 หรือ 31 วัน เราจึงสามารถใช้ 1 หรือ 0 เพื่อสลับกัน แล้วเพิ่มค่าคงที่ให้กับตัวเลขนี้:เราได้ตารางค่าที่ถูกต้องจะถูกเน้นด้วยตัวหนา:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 |
เริ่มดี! มีค่าที่ถูกต้องอยู่แล้วสำหรับมกราคมและสำหรับเดือนมีนาคมถึงกรกฎาคมรวมอยู่ด้วย กุมภาพันธ์เป็นกรณีพิเศษ และเราจะจัดการกับมันในภายหลัง หลังจากเดือนกรกฎาคม สำหรับเดือนที่เหลือ ลำดับของการรับ 0 และ 1 จะต้องถูกกลับรายการ
ในการทำเช่นนี้ เราสามารถบวก 1 เข้ากับเงินปันผลได้:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 30 | 31 |
ตอนนี้ค่าที่ถูกต้องคือตั้งแต่เดือนสิงหาคมถึงธันวาคม แต่ตามที่คาดไว้ ค่าสำหรับเดือนอื่นๆ ไม่ถูกต้อง เรามาดูกันว่าเราจะรวมสูตรเหล่านี้ได้อย่างไร
มาส์กโอเวอร์เลย์
สิ่งนี้ต้องใช้ฟังก์ชันที่กำหนดเป็นชิ้นๆ แต่ - เนื่องจากมันดูน่าเบื่อสำหรับฉัน - ฉันคิดถึงวิธีแก้ปัญหาอื่น โดยใช้ส่วนหนึ่งของฟังก์ชันในช่วงเวลาหนึ่ง กับอีกช่วงหนึ่งฉันคิดว่ามันง่ายที่สุดในการค้นหานิพจน์ที่เท่ากับ 1 ในแอปพลิเคชันเดียวและ 0 ในแอปพลิเคชันที่เหลือ วิธีการที่เราแยกอาร์กิวเมนต์ด้วยนิพจน์ในการคูณอาร์กิวเมนต์นั้นออกจากสูตรที่อยู่นอกขอบเขตของแอปพลิเคชัน ฉันเรียกว่า "การกำบัง" เพราะพฤติกรรมนี้คล้ายกับบิตมาสก์บางประเภท
หากต้องการใช้วิธีนี้ในส่วนสุดท้ายของฟังก์ชัน คุณต้องค้นหานิพจน์ที่เท่ากับ 1 สำหรับ และ - เนื่องจากค่าอาร์กิวเมนต์จะน้อยกว่า 16 เสมอ การหารจำนวนเต็มด้วย 8 จึงใช้ได้
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
⌊ NS ⁄ 8 ⌋ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
ทีนี้ โดยใช้มาสก์นี้ โดยใช้นิพจน์แทน 1 ในการปันผล เราสามารถแทนที่ลำดับของการได้ 0 และ 1 ของสูตรด้วยค่าที่ตรงกันข้าม:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 30 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ยูเรก้า! ทุกอย่างถูกต้อง ยกเว้นเดือนกุมภาพันธ์ เซอร์ไพรส์.
กุมภาพันธ์
เดือนใดๆ มี 30 หรือ 31 วัน ยกเว้นเดือนกุมภาพันธ์กับวันที่ 28 (ปีอธิกสุรทินอยู่นอกเหนือขอบเขตของปัญหานี้) ในขณะนี้ ตามสูตรของเรา มันมี 30 วัน ดังนั้น คงจะดีถ้าลบนิพจน์เท่ากับ 2 atสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือสิ่งนี้ซึ่งสวมหน้ากากทุกเดือนหลังจากเดือนกุมภาพันธ์:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2 mod NS | 0 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
เปลี่ยนค่าคงที่ฐานเป็น 28 บวก 2 ในเดือนที่เหลือ เราได้สูตร:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 29 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ขออภัย ขณะนี้เดือนมกราคมสั้นลง 2 วัน โชคดีที่มันง่ายที่จะได้รับนิพจน์ที่ใช้กับเดือนแรกเท่านั้น นั่นคือค่าผกผันของตัวเลขที่ปัดเศษลง คูณด้วย 2 เราจะได้สูตรสุดท้าย:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x) | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
Afterword
นี่คือ - สูตรการหาจำนวนวันในเดือนใดๆ ของปี โดยใช้เลขคณิตที่ง่ายที่สุด ครั้งต่อไปที่คุณนึกถึงจำนวนวันในเดือนกันยายน ให้ทำเช่นนี้ด้วยฟังก์ชัน JavaScript แบบบรรทัดเดียว:ฟังก์ชัน f (x) (ส่งคืน 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)
ส่วนที่II
บทนำ
ในส่วนแรกได้สูตรที่สั้นและสง่างามเล็กน้อย ข้อดีหลักคือความเรียบง่ายของอุปกรณ์ทางคณิตศาสตร์ การไม่มีกิ่งก้านและนิพจน์เงื่อนไข และความกะทัดรัด ข้อเสีย - นอกเหนือจากความจริงที่ว่าคุณจะไม่ใช้ในโครงการของคุณ - รวมถึงการขาดการตรวจสอบสำหรับ viscoconut และปีที่ไม่ใช่ปีอธิกสุรทินดังนั้นฉันจึงกำหนดภารกิจในการสร้างฟังก์ชัน NSเพื่อให้ค่า ฉ (x, y)ทุกเดือน NSแทนด้วยตัวเลขตั้งแต่ 1 ถึง 12 และหนึ่งปี yมากกว่า 0 เท่ากับจำนวนวันในหนึ่งเดือน NSในปีนี้ y.
สำหรับคนใจร้อนมีคำตอบใต้สปอยนะครับ ส่วนคนที่เหลือขอให้ติดตามครับ
ตอบ
ส่วนที่เหลือของแผนก: modและ ⌊⌋
เพื่อความชัดเจนของภาพ ให้ตกลงกันว่าในบางสูตร ตัวดำเนินการหารด้วยเศษเหลือจะถูกแทนที่ด้วยวงเล็บล่าง ซึ่งดูเหมือนว่าจำเป็นสำหรับฉัน:ปีอธิกสุรทิน
ในปีอธิกสุรทิน จะมีวันเพิ่มตามปฏิทิน: 29 กุมภาพันธ์ อย่างที่คุณทราบ ปีอธิกสุรทินคือผลคูณของ 4 และไม่ใช่ผลคูณของ 100 หรือผลคูณของ 400 มาเขียนนิพจน์ที่เหมือนกับข้อความนี้กัน:ในการแปลงนิพจน์นี้เป็นนิพจน์เกี่ยวกับพีชคณิต จำเป็นต้องใช้การฉีดแบบฟอร์มกับผลลัพธ์ของนิพจน์:
ซึ่งจะทำให้คุณได้ 1 เมื่อหารไม่มีเศษและ 0 เมื่อหารด้วยเศษเหลือเพื่อใช้ในสูตรการกำหนดจำนวนวันในหนึ่งเดือน
เป็นหน้าที่ NS "คุณสามารถใช้ 1 ลบเศษเหลือสำหรับ:
NS | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
กรัม "(x) | อินฟินิตี้ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
เป็นเรื่องง่ายที่จะเห็นว่าการเพิ่มเงินปันผลและตัวหารด้วย 1 ทำให้เราได้สูตรที่ถูกต้องสำหรับ:
NS | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
กรัม "(x) | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ดังนั้นเราจึงเขียนนิพจน์เป็น:
และเราเขียนนิพจน์เป็น:
เมื่อใช้วิธีนี้เราจะได้ฟังก์ชันดังต่อไปนี้ กรัม (y)ค่าที่จะเป็น 1 ถ้าปีเป็นปีอธิกสุรทิน หรือ 0 อย่างอื่น:
y | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 |
---|---|---|---|---|---|---|---|---|---|---|---|
กรัม (y) | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
y | 2000 | 2100 | 2200 | 2300 | 2400 | 2500 | 2600 | 2700 | 2800 | 2900 | 3000 |
กรัม (y) | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
ปีอธิกสุรทินเป็นตัวหนา
ฉันขอเตือนคุณว่าภายในกรอบของข้อตกลงที่ยอมรับ ผู้ดำเนินการรับส่วนที่เหลือของแผนกสามารถแสดงเป็น modและ ⌊⌋.
มาส์กโอเวอร์เลย์
ในสูตรส่วนที่เป็นการแก้ไขเพิ่ม 2 วันในเดือนมกราคม หากเราลบตัวประกอบของ 2 และแทนที่ 1 ด้วย 2 ในตัวเศษ สูตรนี้จะเพิ่ม 2 วันในเดือนมกราคม และ 1 วันเป็นเดือนกุมภาพันธ์ ซึ่งจะทำให้เราเพิ่มวันในปีอธิกสุรทินได้ เพื่อความชัดเจน เราใช้ค่ากลางในสูตร กรัม (y)และเช่น yเราใช้ปี 2000 (อธิกสุรทิน) และปี 2544 (ไม่ใช่ปีอธิกสุรทิน):NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x, 2000) | 31 | 29 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ฉ (x, 2001) | 30 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 30 |
ค่าของทุกเดือนยกเว้นเดือนมกราคมของปีที่ไม่ใช่ปีอธิกสุรทินนั้นถูกต้อง
เพื่อแก้ไขความเข้าใจผิดที่น่ารำคาญนี้ ให้เพิ่ม 1 วันถึงเดือนมกราคมด้วยสูตรที่เรารู้อยู่แล้ว:
หรือ:
NS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ฉ (x, 2000) | 31 | 29 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ฉ (x, 2001) | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 30 |
บทสรุป
เป็นผลให้ยุ่งยากมากขึ้น แต่ได้สูตรสากลมากขึ้นซึ่งสามารถใช้เพื่อรับจำนวนวันในเดือนของปีหนึ่ง:ฟังก์ชัน f (x, y) (ส่งคืน 28 + ((x + Math.floor (x / 8))% 2) + 2% x + Math.floor ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
ตัวอย่างในภาษา C # ideone.com/fANutz
1
... ฉันไม่รู้วิธีใช้ตัวช่วยจำ ดังนั้นฉันจึงแอบดูป้ายบนอินเทอร์เน็ต
2
... "พื้นฐาน" หรือ "กฎที่มีข้อยกเว้นมากมาย" เช่นเดียวกับกฎส่วนใหญ่
3
... ในขั้นต้น กุมภาพันธ์เป็นเดือนสุดท้ายของปีในปฏิทินโรมัน ดังนั้นจึงมีเหตุผลที่สั้นกว่าเดือนอื่นๆ นอกจากนี้ยังมีตรรกะในการเพิ่มหรือลบวันเมื่อสิ้นปี ดังนั้นความยาวจึงแปรผันได้
อัปเดต 1:
การแปลอื่นของส่วนแรกใน
เครื่องคำนวณวันที่ออกแบบมาเพื่อคำนวณจำนวนวันระหว่างวันที่ และเพื่อค้นหาวันที่โดยการเพิ่มหรือลบจำนวนวันที่ระบุจากวันที่ที่ทราบ
เพิ่มวันถึงวันที่
หากต้องการทราบวันที่ในจำนวนวันที่กำหนด ให้ใช้ตัวเลือกนี้ ป้อนวันที่เริ่มต้นและจำนวนวันที่จะเพิ่มเข้าไป ใช้ค่าลบเพื่อลบ เครื่องคิดเลขยังมีตัวเลือกในการเพิ่มเฉพาะวันทำการ
การคำนวณจำนวนวันระหว่างวันที่
วิธีการคำนวณนี้จะตอบคำถามว่า "นับแต่วันที่ผ่านไปกี่วัน" ป้อนวันที่เริ่มต้นและวันที่สิ้นสุด แล้วคลิกปุ่ม "คำนวณ" เครื่องคิดเลขจะแสดงจำนวนวันที่ป้อนระหว่างวันที่ป้อน แยกจากกัน เครื่องคิดเลขจะแสดงจำนวนวันทำการ
ด้วยตัวเลือกนี้ คุณสามารถคำนวณจำนวนวันที่เหลือจนกว่าจะถึงเหตุการณ์หนึ่ง เช่น วันเกิดหรือวันหยุด เมื่อต้องการทำเช่นนี้ ให้ป้อนวันที่ของวันนี้ในฟิลด์วันที่เริ่มต้น และวันที่ของเหตุการณ์ในฟิลด์วันที่สิ้นสุด
วันหยุด
เครื่องคิดเลขสามารถคำนวณ บวก ลบ ได้ทั้งวันตามปฏิทินและวันทำการ วันหยุดนักขัตฤกษ์อย่างเป็นทางการคือ:
- 1,2,3,4,5,6,8 มกราคม - วันหยุดปีใหม่
- 7 มกราคม - คริสต์มาสออร์โธดอกซ์
- 23 กุมภาพันธ์ - วันผู้พิทักษ์แห่งมาตุภูมิ
- 8 มีนาคม - วันสตรีสากล
- 1 พฤษภาคม - ฤดูใบไม้ผลิและวันแรงงาน
- 9 พฤษภาคม - วันแห่งชัยชนะ
- 12 มิถุนายน - วันแห่งรัสเซีย
- 4 พฤศจิกายน - วันสามัคคีแห่งชาติ
หากวันหยุดนักขัตฤกษ์ตรงกับวันเสาร์หรือวันอาทิตย์ ให้เลื่อนไปเป็นวันทำการถัดไป แต่บางครั้งวันหยุดสุดสัปดาห์ก็ถูกย้ายไปที่อื่นในปฏิทิน ตัวอย่างเช่น วันเสาร์และวันอาทิตย์ซึ่งตรงกับวันหยุดปีใหม่ สามารถย้ายไปยังเดือนพฤษภาคมเพื่อขยายวันหยุดในเดือนพฤษภาคม
เมื่อคำนวณวัน เครื่องคิดเลขจะพิจารณาทั้งวันหยุดราชการและการโอนทั้งหมด