ข้อสอบท้ายค่าย 1 ศูนย์ สอวน.กรุงเทพมหานคร ปี 2567 ข้อที่ 5
Problem: Credit Card
สรุปโจทย์
เรามีเลขบัตรเครดิต 16 หลัก โดยเราต้องการตรวจสอบเลขบัตรเครดิตว่า ถูกต้องหรือไม่
โดยมีขั้นตอนดังนี้:
ตัวอย่าง: 5490123456789128
- นำเลขหลักสุดท้ายออก
(549012345678912) - reverse ตัวเลข แล้ว คูณ 2 กับตัวเลขในหลักที่เป็นคี่
(2 1 9 8 7 6 5 4 3 2 1 0 9 4 5 -> 4 1 18 8 14 6 10 4 6 2 2 0 18 4 10) - แบ่งเลขสองหลักใดๆ ให้เป็นหลักเดียว 2 ตัว เช่น 18 -> 1, 8
(4 1 18 8 14 6 10 4 6 2 2 0 18 4 10 -> 4 1 1 8 8 1 4 6 1 0 4 6 2 2 0 1 8 4 1 0) - หาผลรวมเลขทุกตัว
(4 + 1 + 1 + 8 + 8 + 1 + 4 + 6 + 1 + 0 + 4 + 6 + 2 + 2 + 0 + 1 + 8 + 4 + 1 + 0 = 62) - ถ้าเลขหลักสุดท้ายของบัตรเครดิตคือ (10 - (ผลรวม mod 10)) mod 10 แล้ว บัตรเครดิตใบนี้ จะเป็นบัตรเครดิตที่ถูกต้อง
((10 - (62 mod 10)) mod 10 = 8 ซึ่งตรงกับหลักสุดท้ายของ 5490123456789128)
สิ่งที่ต้องทำ
เขียนโค้ดเพื่อตรวจสอบว่า เลขบัตรเครดิตที่กำหนดให้ เป็นบัตรเครดิตจริงหรือไม่
ตัวอย่าง
Input | Output |
---|---|
5490123456789128 | yes |
5647373649364392 | no |
Prerequisites
- Arrays
- Strings
Solution
วิธีทำ
รับ Input มาเป็น String แล้วแปลงเป็น Array โดยแต่ละช่องจะเก็บแต่ละหลัก แล้วก็ทำตามขัั้นตอนที่โจทย์กำหนดให้โดยตรงเลย
เรียงลำดับแต่ละขั้นตอน:
- แปลง Input ที่เป็น String เป็น Array
- ไม่จำเป็นต้องกลับหลังเลขบัตรเครดิต โดยเราสามารถคูณ 2 ในหลักที่เป็นคู่แทนการคูณในหลักที่เป็นคี่ได้
- และ 4. หาผลรวมของเลขทั้งหมด โดยหากมีช่องใดที่เป็นเลข 2 หลัก เราก็แค่คิดแยกหลัก ซึ่งหลักแรกจะเป็น 1 แน่ๆ และในการหาหลักหน่วย สามารถหาได้โดยการนำ ตัวเลขนั้น mod 10 ได้ นั่นคือ หากเจอเลข 2 หลัก ค่าที่จะต้องเพิ่มคือ 1 + (num mod 10)
- ตรวจสอบตามเงื่อนไขของโจทย์ว่า (10 - (ผลรวม mod 10)) mod 10 มีค่าเท่ากับหลักสุดท้ายหรือไม่ แล้วก็พิมพ์ออกมาเป็น "yes" หรือ "no" ตามที่เช็กได้
Code
credit_card.c
#include <stdio.h>
int main(){
char str[16];
scanf("%s", str);
// นำค่าในแต่ละหลักมาเก็บใน Array
int a[16];
for (int i = 0; i < 16; i++) {
a[i] = str[i] - '0';
}
// ขั้นตอนที่่ 2, 3 และ 4: x2 ในหลักที่เป็นคู่ พร้อมกับหาผลรวม
int sum = 0;
for (int i = 0; i < 15; i++) {
if (i % 2 == 0) a[i] *= 2;
// ถ้าตัวเลขนั้นๆ มี 2 หลัก ให้จับแยกเป็น 2 หลัก
if (a[i] > 9) {
// สังเกตว่า ถ้าจำนวนนี้มี 2 หลัก ค่าที่มากที่สุดในหลักสิบ เป็นได้แค่ 1 ดังนั้นเราจะ +1 แล้วหาค่าในหลักหน่วยโดยการนำค่ามาหาเศษเหลือจากการหารด้วย 10
sum += 1 + (a[i] % 10);
}
else sum += a[i];
}
// ตรวจสอบตามขั้นตอนที่ 5
if ((10 - (sum % 10)) % 10 == a[15]) {
printf("yes");
}
else {
printf("no");
}
return 0;
}