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

การตัดตัวเลขที่เป็นไปได้โดยที่ส่วนสูงสุดหารด้วย 3 ใน C++


ในปัญหานี้ เราได้รับค่าจำนวนเต็มจำนวนมาก (สูงสุด 10 5 ตัวเลข) งานของเราคือพิมพ์จำนวนการตัดทั้งหมดที่ต้องการ โดยให้ส่วนสูงสุดหารด้วย 3 ลงตัว

มาดูตัวอย่างทำความเข้าใจปัญหากัน

ป้อนข้อมูล − 9216

ผลลัพธ์ − 3

คำอธิบาย − จำนวนหารด้วย 9|21|6.

ในการแก้ปัญหานี้ เราจะต้องเริ่มด้วยบิตที่มีนัยสำคัญน้อยที่สุด นั่นคือ หลักสุดท้ายของตัวเลข สำหรับตรงนี้ เราจะหาจำนวนที่น้อยที่สุดที่หารด้วยสามได้ แล้วอัปเดตจำนวนตามนั้น

ตัวอย่าง − ถ้า arr[i] สร้างตัวเลขที่แบ่งได้ 3 ตัว เราจะเพิ่มจำนวนและย้ายไปยังหลักถัดไปของตัวเลข หาก arr[i] ไม่หารด้วย 3 ลงตัว เราจะรวมมันกับหลักถัดไปและตรวจสอบการหารด้วย 3 ลงตัว

การหารด้วย 3 − ตัวเลขหารด้วย 3 ลงตัวถ้าจำนวนหลักของตัวเลขหารด้วยสามลงตัว

ตัวอย่าง

โปรแกรมแสดงการใช้งานโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
int countMaximum3DivisibleNumbers(string number){
   int n = number.length();
   vector<int> remIndex(3, -1);
   remIndex[0] = 0;
   vector<int> counter(n + 1);
   int r = 0;
   for (int i = 1; i <= n; i++) {
      r = (r + number[i-1] - '0') % 3;
      counter[i] = counter[i-1];
      if (remIndex[r] != -1)
         counter[i] = max(counter[i], counter[remIndex[r]] + 1);
         remIndex[r] = i+1;
   }
   return counter[n];
}
int main() {
   string number = "216873491";
   cout<<"The number of 3 divisible number created by cutting "<<number<<" are : " <<countMaximum3DivisibleNumbers(number);
   return 0;
}

ผลลัพธ์

The number of 3 divisible number created by cutting 216873491 are : 5