ข้อสอบท้ายค่าย 1 ศูนย์ สอวน.กรุงเทพมหานคร ปี 2566 ข้อที่ 4
Problem
สรุปโจทย์
รับค่าจำนวนเต็ม 3 จำนวน จำนวนวันในเดือน วันแรกของเดือนคือวันอะไร (1 = วันอาทิตย์, 2 = วันจันทร์, ... 7 = วันเสาร์) และ วันที่ต้องการหาค่าดวง ซึ่งมีค่าเท่ากับผลรวมของวันที่ของช่องที่อยู่ติดกับวันนั้นๆ บนปฏิทิน
สิ่งที่ต้องทำ
เขียนโค้ดเพื่อหาค่าดวงของวันนั้นๆ
ตัวอย่าง
Input | Output |
---|---|
30 4 15 |
60 |
![]() |
Prerequisites
- C/C++ Basics
Solution
วิธีทำ
ให้คอลัมน์ซ้ายสุดเป็นคอลัมน์ที่ 0 ถัดไปเป็น 1 ไปเรื่อยๆ
สังเกตว่าถ้าวันที่ 1 อยู่ในคอลัมน์ที่ \(S\) แล้ววันที่ \(N\) จะอยู่ในคอลัมน์ที่ \((N + S - 1)\) \(\%\) \(7\)
จากนั้นใช้ if-else
เพื่อเช็คว่า:
- หากวันที่ \(S\) ไม่อยู่ในคอลัมน์ซ้ายสุดและ \(S \neq 1\) ให้บวกค่าดวงด้วย \(S-1\) และทำเช่นเดียวกันกับช่องทางด้านขวา
- ส่วนช่องด้านบน เช็คว่า ถ้าจำนวนนั้นมีค่ามากกว่า 7 ให้นำค่าดวงบวกด้วย \(S - 7\) และทำเช่นเดียวกันสำหรับช่องด้านล่าง
Code
posn1_66_bkk_p4.cpp
#include <stdio.h>
int main(){
int X, S, N;
scanf("%d %d %d", &X, &S, &N);
S--; // เนื่องจากข้อมูลนำเข้าอยู่ในรูปแบบ 1-indexed
// หา column ในปฏิทินของวันที่ที่รับ input มา
int col = (N + S - 1) % 7;
int ans = 0;
// if-else เพื่อคำนวณตรงๆ
if (N > 7) ans += N - 7;
if (N + 7 <= X) ans += N + 7;
if (col > 0 && N > 1) ans += N - 1;
if (col < 6 && N < X) ans += N + 1;
printf("%d", ans);
}