Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

พิมพ์ตำแหน่งหลักที่จะลบออกเพื่อให้ตัวเลขหารด้วย 6 ใน C++


ในปัญหานี้เราได้รับตัวเลขและเราต้องลบตัวเลขเพิ่มเติมออกจากตัวเลข เพื่อให้จำนวนใหม่ที่เกิดขึ้นหลังจากการลบหารด้วย 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