คำนวณวันในสัปดาห์จากวันที่
โจทย์
สูตร Zeller’s congruence เป็นอัลกอริทึมที่พัฒนาโดย Christian Zeller เพื่อคำนวณวันในสัปดาห์ โดยมีสูตรดังนี้:
สูตรนี้ใช้ในการคำนวณหาวันในสัปดาห์ โดยสูตรจะมีตัวแปรหลัก ๆ ดังนี้:
- แทนวันในสัปดาห์ (0: วันเสาร์, 1: วันอาทิตย์, 2: วันจันทร์, 3: วันอังคาร, 4: วันพุธ, 5: วันพฤหัสบดี, 6: วันศุกร์)
- แทนวันที่ของเดือน
- แทนเดือน (3: มีนาคม, 4: เมษายน, … , 12: ธันวาคม) เดือนมกราคมและกุมภาพันธ์จะถูกนับเป็นเดือนที่ 13 และ 14 ของปีที่แล้ว
- แทนศตวรรษ (เช่น ปีหารด้วย 100)
- แทนปีในศตวรรษ (เช่น ปี mod 100)
| Input | Output |
|---|---|
| 2024 8 28 | Wednesday |
โค้ด
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int y = scanner.nextInt();
int m = scanner.nextInt();
int q = scanner.nextInt();
y = (m == 1 || m == 2) ? y - 1 : y;
m = (m == 1 || m == 2) ? m + 12 : m;
int k = y % 100;
int j = y / 100;
int h = (q + ((26 * (m + 1)) / 10) + k + (k / 4) + (j / 4) + (5 * j)) % 7;
String day = switch (h) {
case 0 -> "Saturday";
case 1 -> "Sunday";
case 2 -> "Monday";
case 3 -> "Tuesday";
case 4 -> "Wednesday";
case 5 -> "Thursday";
case 6 -> "Friday";
default -> "";
};
System.out.println(day);
}
}คำอธิบาย
ขั้นตอนที่ 1: การเริ่มต้นโปรแกรม
import java.util.Scanner;
public class Day {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);- โค้ดเริ่มต้นด้วยการ import คลาส
Scannerซึ่งเป็นเครื่องมือที่ช่วยให้เราสามารถรับข้อมูลจากผู้ใช้ได้ - เราสร้างคลาสชื่อ
Mainและกำหนดเมธอดmainซึ่งเป็นจุดเริ่มต้นของโปรแกรม - เราสร้างตัวแปร
scannerเพื่อใช้รับข้อมูลจากผู้ใช้
ขั้นตอนที่ 2: การรับข้อมูล
int y = scanner.nextInt();
int m = scanner.nextInt();
int q = scanner.nextInt();- เราใช้
scannerเพื่อรับข้อมูล 3 ตัวจากผู้ใช้: yคือปี (year)mคือเดือน (month)qคือวันที่ (day of the month)
ขั้นตอนที่ 3: การปรับค่าปีและเดือน
y = (m == 1 || m == 2) ? y - 1 : y;
m = (m == 1 || m == 2) ? m + 12 : m;- ในสูตร Zeller’s congruence เราต้องปรับค่าปีและเดือนถ้าเดือนเป็นมกราคม (1) หรือกุมภาพันธ์ (2)
- ถ้าเป็นเดือนมกราคมหรือกุมภาพันธ์:
- ลดค่าปีลง 1
- เพิ่มค่าเดือนขึ้น 12 (ทำให้มกราคมกลายเป็นเดือนที่ 13 และกุมภาพันธ์กลายเป็นเดือนที่ 14 ของปีก่อนหน้า)
ขั้นตอนที่ 4: การคำนวณค่า k และ j
int k = y % 100;
int j = y / 100;kคือเลข 2 ตัวสุดท้ายของปี (year of the century)jคือเลขศตวรรษ (zero-based century)
ขั้นตอนที่ 5: การคำนวณ Zeller’s Congruence
int h = (q + ((26 * (m + 1)) / 10) + k + (k / 4) + (j / 4) + (5 * j)) % 7;นี่คือสูตร Zeller’s congruence ที่ใช้คำนวณวันในสัปดาห์:
qคือวันที่((26 * (m + 1)) / 10)เป็นส่วนของการปรับค่าเดือนkและ(k / 4)เกี่ยวข้องกับปีในศตวรรษ(j / 4)และ(5 * j)เกี่ยวข้องกับการปรับค่าศตวรรษ- สุดท้ายเราใช้
% 7เพื่อให้ได้เลข 0-6 ซึ่งแทนวันในสัปดาห์
ขั้นตอนที่ 6: การแปลงตัวเลขเป็นชื่อวัน
String day = switch (h) {
case 0 -> "Saturday";
case 1 -> "Sunday";
case 2 -> "Monday";
case 3 -> "Tuesday";
case 4 -> "Wednesday";
case 5 -> "Thursday";
case 6 -> "Friday";
default -> "";
};- เราใช้
switchเพื่อแปลงค่าh(0-6) เป็นชื่อวันในภาษาอังกฤษ - ค่า
hแต่ละค่าจะตรงกับวันในสัปดาห์ เช่น 0 คือวันเสาร์, 1 คือวันอาทิตย์ เป็นต้น
ขั้นตอนที่ 7: การแสดงผลลัพธ์
System.out.println(day);หลักการทำงาน
ปรับปรุงล่าสุด