ในปัญหานี้เราได้รับตัวเลขและเราต้องลบตัวเลขเพิ่มเติมออกจากตัวเลข เพื่อให้จำนวนใหม่ที่เกิดขึ้นหลังจากการลบหารด้วย 6 หารด้วย 6
มาดูตัวอย่างเพื่อเรียนรู้แนวคิดกันดีกว่า −
Input : 1324 Output : 4
คำอธิบาย − เมื่อเอาเลข 4 ออก เราจะได้ 132 หารด้วย 6 ลงตัว
ที่นี่เราได้รับตัวเลขและต้องคืนตำแหน่งจากตำแหน่งที่ลบตัวเลขออกเพื่อให้หารด้วย 6 ลงตัว
สำหรับการแก้ปัญหานี้ เราจะพยายามสร้างตรรกะที่แก้ปัญหาได้ สำหรับสิ่งนี้ เราจะใช้ความรู้ที่ว่าถ้าตัวเลขหารด้วย 2 ลงตัว 3 ก็จะหารด้วย 6 ลงตัว
หลังจากลบตัวเลขออกจากตัวเลขแล้ว หมายเลขใหม่ที่สร้างขึ้นจะถูกตรวจสอบการหารของ 6 นั่นคือการหาร 2 และ 3 ทั้งคู่
แนวทาง
จากตัวเลขเราสามารถหาได้ว่าตัวเลขที่สร้างโดยการลบหลักจะหารด้วย 6 หรือไม่ มีสองเงื่อนไขหากเราเห็นหลักสุดท้ายของตัวเลข
เมื่อหลักสุดท้ายเป็นเลขคี่
เมื่อหลักสุดท้ายเป็นเลขคี่ ทางเดียวที่ทำได้คือลบหลักสุดท้าย และเลขใหม่จะไม่หารด้วย 6 ต่อเมื่อหลักถัดจากหลักสุดท้ายเป็นเลขคู่เท่านั้น มิฉะนั้นจะไม่มีทางแก้ไขได้
เมื่อหลักสุดท้ายเป็นเลขคู่
หากหลักสุดท้ายเป็นเลขคู่ เราต้องหาเศษที่เหลือเมื่อหารด้วย 3 และจากตัวเลขนี้ เราจะสามารถตรวจสอบได้ว่าสามารถลบหลักใดได้บ้าง
ในการหารจำนวนด้วย 3 สามกรณี −
เหลือ 1 − หากเศษที่เหลือของการหารเป็น 1 ตัวเลขใดๆ 1, 4, 7 ก็สามารถลบออกจากอาร์เรย์ได้ หากสามารถลบตัวเลขได้หลายหลัก เราจะลบตัวเลขนั้นออกในลักษณะที่ตัวเลขที่เกิดขึ้นหลังจากการลบออกจะมีจำนวนมากที่สุด
เหลือ 2 − หากเศษที่เหลือของการหารเป็น 2 ตัวเลขใดๆ 2, 5, 8 จะถูกลบออกจากอาร์เรย์ หากสามารถลบตัวเลขได้หลายหลัก เราจะลบตัวเลขดังกล่าวออกในลักษณะที่ตัวเลขที่เกิดขึ้นหลังจากการลบออกจะมีจำนวนมากที่สุด
เหลือ 3 − หากเศษที่เหลือของการหารเป็น 1 เลข 3, 6, 9 ใดๆ จะถูกลบออกจากอาร์เรย์ หากสามารถลบตัวเลขได้หลายหลัก เราจะลบตัวเลขดังกล่าวออกในลักษณะที่ตัวเลขที่เกิดขึ้นหลังจากการลบออกจะมีจำนวนมากที่สุด
จากสิ่งเหล่านี้ มาแก้ปัญหาเล็กน้อยและค้นหาผลลัพธ์ที่ต้องการ -
เมื่อหลักสุดท้ายเป็นเลขคี่
1. 34241341
ในกรณีนี้ หลักเดียวที่สามารถลบออกได้คือ 1 จากตำแหน่งสุดท้าย และจำนวนที่เกิดขึ้นจะเป็น 3432134 ซึ่งหารด้วย 6 ลงตัว ดังนั้นเราจะคืนตำแหน่ง 1 ที่ถูกลบ เช่น 8
2. 3214241
ในกรณีนี้ หลักเดียวที่สามารถลบออกได้คือ 1 จากตำแหน่งสุดท้าย และจำนวนที่เกิดขึ้นจะเป็น 341224 ซึ่งหารด้วย 6 ไม่ลงตัว ดังนั้นเราจะคืนค่า -1
เมื่อหลักสุดท้ายเป็นเลขคู่
1. 8097860
ในกรณีนี้ เราต้องหารตัวเลขด้วย 3 แล้วหาเศษเหลือเท่ากับ 2 ดังนั้น ในกรณีของ 2 เป็นเศษที่เหลือ เราสามารถลบ 2, 5, 8 ออกจากตัวเลขได้ ดังนั้น 8 จากตำแหน่งที่ 1 และ 5 สามารถลบออกเพื่อให้จำนวนหารด้วย 2 หารด้วย 2 เราจะลบ 8 ออกจากตำแหน่งที่ 5 เพราะถ้าเราลบออกจากตำแหน่งที่ 1 จำนวนที่น้อยกว่าจะถูกส่งคืน จำนวนใหม่ที่เกิดขึ้นจะเป็น 809760 ซึ่งหารด้วย 6 ลงตัว ดังนั้นเราจะคืนค่า 5.
ตัวอย่าง
ตามตรรกะนี้ ให้สร้างโปรแกรมเพื่อแก้ปัญหา -
#include <bits/stdc++.h> using namespace std; void isDivisibleBy6(string num){ int n = num.length(); int a[n]; int sum = 0; for (int i = 0; i < n; i++) { a[i] = num[i] - '0'; sum += a[i]; } if (a[n - 1] % 2){ if ( (a[n - 2] % 2 != 0) || (sum - a[n - 1]) % 3 != 0) { cout << "-1" << endl; } else { cout << n << endl; } } else { int re = sum % 3; int del = -1; int flag = 0; for (int i = 0; i < n - 1; i++) { if ((a[i]) % 3 == re) { if (a[i + 1] > a[i]) { del = i; flag = 1; break; } else { del = i; } } } if (flag == 0) { if (a[n - 2] % 2 == 0 and re == a[n - 1] % 3) del = n - 1; } if (del == -1) cout << -1 << endl; else { cout << del + 1 << endl; } } } int main(){ string number = "343224152"; isDivisibleBy6(number); return 0; }
ผลลัพธ์
5