البرمجة

حلاقة العصي: تحليل برنامج قطع الأعواد بلغة C++

عند مراجعة الشيفرة التي قدمتها، يظهر أن المشكلة تكمن في كيفية تحديد أصغر قيمة في الحلقة الأولى (least). في الحلقة الثانية، عند خفض طول العصي بقيمة least، يجب أن تستند الشرطية على إشارة <= بدلاً من < للتأكد من خصم القيمة الصحيحة وتجنب تخطي القيم التي تساوي صفر.

لتوضيح أكثر، أعدت صياغة الشيفرة لتصحيح هذه المشكلة:

cpp
#include #include #include #include #include using namespace std; int main() { int n; cin >> n; vector<int> arr(n); vector<int> a(n, 1); for (int arr_i = 0; arr_i < n; arr_i++) { cin >> arr[arr_i]; } int count = n; do { cout << count << endl; count = 0; int least = -1; for (int i = 0; i < n; i++) { // for getting least number if (a[i]) { if (least == -1 || arr[i] < least) { least = arr[i]; } } } for (int i = 0; i < n; i++) { // for actual logic if (arr[i] > 0 && a[i]) { arr[i] -= least; count++; } } } while (count); return 0; }

هذه الشيفرة المعدلة يجب أن تحل المشكلة التي تعترضك. الآن يتم التحقق من إشارة <= بشكل صحيح عند تحديد أصغر قيمة، وتم تعيين القيمة الأولى لـ least عند -1 لضمان أن يتم تحديثها بأي قيمة فعالة في الحلقة الأولى.

المزيد من المعلومات

بالتأكيد، دعنا نوسع قليلاً على الموضوع. يبدو أن البرنامج الذي كتبته يحل مشكلة معينة تتعلق بقطع عصي بطول مختلف. في هذه الحالة، يتم قراءة عدد العصي N ثم يتم قراءة أطوال العصي. البرنامج يبدأ بطباعة عدد العصي الأصلي N، ثم يقوم بتحديث طول العصي بخفضها بقيمة العصا الأقصر، ويحسب عدد العصي الفعّالة بعد كل عملية.

الشيفرة المصدرية تستخدم متغير count لتتبع عدد العصي الفعّالة بعد كل عملية. تتكرر العملية حتى لا يتبقى أي عصا. يتم تحديد العصا الأقصر باستخدام المتغير least، والذي يتم تحديثه في الحلقة الأولى بقيمة أول عصا فعّالة، ومن ثم يُستخدم لتحديد قيمة الطول الأقصر في الحلقة الثانية.

في النهاية، يتم طباعة عدد العصي الفعّالة بعد كل عملية. من الجدير بالذكر أن هذه البرمجة تحل مشكلة معينة بناءً على الوصف الذي قدمته، ويبدو أنها تعتمد على قواعد معينة لقطع العصي.

زر الذهاب إلى الأعلى