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

ตรวจสอบว่าจำนวนมากสามารถแบ่งออกเป็นสองส่วนหรือมากกว่าของผลรวมเท่ากันใน C ++


ที่นี่เราจะเห็นโปรแกรมที่สามารถตรวจสอบว่าตัวเลขสามารถแบ่งออกเป็นมากกว่าหนึ่งกลุ่มโดยมีผลรวมเท่ากันหรือไม่ สมมติว่าตัวเลขเช่น 74325 จากนั้นสามารถแบ่งออกเป็นสามส่วน (7), (4, 3), (2, 5) ทั้งหมดมีค่า um เท่ากัน

เราต้องทำตามขั้นตอนเหล่านี้เพื่อแก้ปัญหานี้

  • ใช้ตัวเลขเป็นสตริง
  • ใช้อาร์เรย์เพื่อเก็บผลรวมนำหน้าของอาร์เรย์
  • ตอนนี้กำลังข้ามจากองค์ประกอบที่สองไปยังองค์ประกอบสุดท้าย และส่วนแรกจะเป็น 0 ถึง i-1 ซึ่งผลรวมจะถูกวางไว้ที่ prefix_sum[i - 1]
  • ใช้ตัวแปรอื่นที่ข้ามจาก 1 ถึง n แล้วบวกผลรวมต่อไป
  • หากค่าผลรวมเหมือนกับค่า prefix_sum[i – 1] ในขั้นตอนใดๆ เซ็กเมนต์จะมีผลรวมเท่ากับค่าแรก
  • เริ่มต้นค่าผลรวมของเซ็กเมนต์ใหม่เป็น 0 จากนั้นเลื่อนตัวชี้ต่อไป
  • หากผลรวมของเซ็กเมนต์มากกว่า prefix_sum[i – 1] ในขั้นใดๆ ให้ทำลายลูป
  • หากเราไปถึงจุดหมายสุดท้าย และหากผลรวมของส่วนสุดท้ายเท่ากับผลรวมของส่วนแรก ก็สามารถแบ่งออกเป็นส่วนๆ ของผลรวมที่เท่ากันได้

ตัวอย่าง

#include <iostream>
using namespace std;
bool canBeSegmented(string str) {
   int n = str.length();
   int prefix_sum[n];
   prefix_sum[0] = str[0] - '0';
   for (int i = 1; i < n; i++) {
      prefix_sum[i] = prefix_sum[i - 1] + (str[i] - '0');
   }
   for (int i = 1; i <= n - 1; i++) {
      int sum = prefix_sum[i - 1];
      int prev_sum = 0;
      int it = i;
      bool flag = false;
      while (it < n) {
         prev_sum += str[it] - '0';
         if (prev_sum == sum) {
            prev_sum = 0;
            flag = true;
         } else if (prev_sum > sum) {
            break;
         }
         it++;
      }
      if (prev_sum == 0 && it == n && flag) {
         return true;
      }
   }
   return false;
}
int main() {
   string s = "74325";
   if (canBeSegmented(s))
      cout << "Yes, This can be segmented into more than two segments";
   else
      cout << "No, This can not be segmented into more than two segments";
}

ผลลัพธ์

Yes, This can be segmented into more than two segments