الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لغز: كيف يمكن معرفة العدد الفردي من العدد الزوجي ؟

بدأه رغيد الطيب في 7 يناير 2010 · 6 رد · 3,585 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
/index.php?showtopic=212028

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#2

تم إضافة رد هــــــــــــــناك

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#3

اجابة سليمة

فهل من مزيد ياترى

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#4
if ( least significant bit (LSB) is one 1 )
 then the number is odd

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

شكرا للمشاركة

وهي اجابة مكافئة لطريقة فحص البت الاول من اليمين عن طريق AND

هل ياترى توجد حلول اخرى مبتكرة

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#6

وعليكم السلام ورحمة الله وبركاته

ننظر في أول رقم من اليمين ونحدد انه العدد فردي أو زوجي / وهذه محاولتي

Dim ss As Integer = Val(Microsoft.VisualBasic.Right(TextBox1.Text, 1))

If ss <> 0 And ss <> 2 And ss <> 4 And ss <> 6 And ss <> 8 Then
 MsgBox "العدد فردي" 
Else
 MsgBox "العدد زوجي"
end if

تم تعديل هذه المشاركة بواسطة محمدvb في 7 يناير 2010 في 08:55

#7

بسم الله السميع العليم

سرتني كثيرا الاجابات التي وضعها الشباب فهي تعكس انه لايزال فينا من يهتم بالتفكير المنطقي وابتكار الحلول البرمجية

لكي تعم الفائدة سأضع الحلول البرمجية التي كانت في ذهني عند وضع السؤال (مع العلم بان بعض الشباب هنا قد ذكرها ) ... واسجل هنا اعجابي بفكرة الاخ محمد بالتدوير الرقم 31 مرة كوني لم افكر بهذا مسبقا.

على العموم يمكنك ان تفكر في الكثير من الحلول البرمجية لحل هذه المسئلة ... فمثلا

-----------------

حلول ثنائية :

-----------------

يمكن حقيقة الوصول الى اكثر من طريقة وحل اذا فكرنا بالمسئلة من وجهة نظر ثنائية Binary يعني صفر و واحد ... والمعاملات المستخدمة هنا كثيرة مثلا فقد استخدمنا المعامل And في الحل :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N And 1) = 0 Then
            MsgBox("عدد زوجي")
        Else
            MsgBox("عدد فردي")
        End If

وفي نفس الوقت يمكن استخدام المعامل ORبدلا من AND بطريقة اخرى فنحن نعرف ان المقارنة بإستخدام الـ OR تعيد القيمة 1 في حالة كون احد اطراف المقارنة يساوي 1 ويمكن بالتالي استغلال الامر ... بحيث نقارن العدد المدخل مع الواحد وفي حال كون العدد فردي فإن الناتج سيكون مساوي للعدد المدخل (لماذا ؟ ..... لأن البت الاول من العدد الفردي هو 1 وبالتالي مقارنته مع الواحد سيكون 1 وبهذا لن يتغيير الرقم الفردي) .... كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N Or 1) = N Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

اما في حالة العدد الزوجي فأن البت الاول هو صفر ومقارنته مع الواحد ستولد عدد جديد يزيد عن العدد الاصلي بواحد نتيجة لتحول البت الاول في العدد الزوجي بعد المقارنة الى 1 ... بكلام آخر :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N Or 1) = (N + 1) Then
            MsgBox("عدد زوجي")
        Else
            MsgBox("عدد فردي")
        End If

لاحظ ان الكودين السابقين عبارة عن طريقة واحدة وهي استخدام الـ OR للمقارنة مع الواحد ارفقته مرتين لتوضيح الفكرة فقط

حل آخر يمكن التفكير فيه وهو المعامل XOR ... وهو من اجمل المعاملات وله خواص محببة تجعله صديق للمهتمين بتشفير البيانات والمهم لنا هنا انه يعيد القيمة 1 في حال اختلاف الاعداد المقارنة وصفر في حال تساويها فمقارنة الواحد بالصفر او الصفر بالواحد عن طريق الـ XOR تعيد القيمة واحد .... بينما مقارنة الواحد بالواحد و الصفر بالصفر فتعيد القيمة صفر .... من هذه المعلومات البسيطة اظنك قد فطنت الى الحل البسيط الذي سنستخلصه هنا ..... اذا فكرت ستجد ان مقارنة اي عدد بالواحد عن طريق الـ XOR ستجعل الناتج يكون اقل من العدد الفردي المدخل وفي حال كون العدد المدخل هو عدد زوجي فان الناتج سيكون اكبر بواحد (لأن الصفر الاولى ستصبح 1) والعكس للعدد الفردي فان البت الاولى ستصبح صفرا ... نستنتج من ذلك با اختصار :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N Xor 1) < N Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

لا اعرف اذا كان ينبغي الاكتفاء بهذه الحلول الثنائية ام نضيف لها ... ودعنا ناخذ حل واحد اضافي ... هو باستخدام التدوير ... فتدوير الارقام يكون اما الى الشمال عن طريق >> او الى اليمين عن طريق << ... وبالتالي ستجد اننا اذا دورنا الرقم الزوجي مرة واحدة الى اليمين فانه سوف يفقد البت الاولى من اليمين فاذا عدنا ودورناه مره اخرى ولكن الى الشمال فاننا سنستعيد الصفر الضائع مرة اخرى وسيبقى الرقم الزوجي كما هو .... غير ان تدوير الرقم الفردي الى اليمين مرة ثم الى الشمال مباشرة سيجعله يفقد البت الاول ويتحول من 1 الى صفر .... وهذه خاصية يمكن استغلالها كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N >> 1 << 1 < N)Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

قد يبدو الشرط :

N>>1<<1<N

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

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N >> 1 << 1) = N Then
            MsgBox("عدد زوجي")
        Else
            MsgBox("عدد فردي")
        End If

ما اريد قوله هنا انه يمكننا استنتاج الكثير من الحلول البرمجية ثنائيا و سنكتفي بهذه الحلول كامثلة.

--------------------

الحلول الرياضية :

--------------------

اذا مزجنا الارقام والعمليات الحسابية البسيطة جدا مع بعض دوال التحويلات العددية كالتحويل الى Integer باستخدام Int او غيرها سنحصل على الكثير من الاجابات نكتفي بثلاث هنا .... خذ مثلا ... اذا قسمنا العدد المدخل N على اثنين واهملنا الجزء العشري عن طريق Int ثم ضربنا الناتج بـ 2 فإننا سنحصل على العدد N مرة اخرى اذا كان زوجيا اما اذا كان فرديا فان الناتج بالتأكيد سيكون اقل من N والسبب ببساطة يكمن في كونه بعد التخلص من الجزء العشري (الذي هو غير موجود اصلا في حالة العدد الزوجي) فبضربه مجددا بـ 2 يعيده لحالته الطبيعية اما العدد الفردي فيكون قد خسر جزءا منه بسبب Int فلا يعود كما كان.

لنتجاهل هلوستي السابقة ونرى الحل فهو كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If Int(N / 2) * 2 < N Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

حل آخر .... اذا اللقيت نظرة على المقالة الاصلية فستجد ان احد الحلول كان بمقارنة القسمة بباقي مع القسمة بدون باقي و القسمة بدون باقي يمكن بسهولة تمثيلها بدون استخدام المعامل العكسي \ وانما باستخدام القسمة العادية مع حذف الجزء العشري بإستخدام الدالة Int كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If Int(N / 2)  <> N / 2 Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

اذا كنت تتفق معي فان اكثر الحلول روعة هي اكثرها بساطة .. وهنا يكمن جمال الرياضيات .... فكر معي بالارقام السالبة؟

الرقم السالب اذا ضرب في نفسه عدد مرات فردية فان الناتج سالب واذا ضرب في نفسة عدد مرات زوجية فان الناتج موجب ... خذ مثلا الرقم سالب واحد (للتبسيط) اذا ضربناه في نفسه مرتين (زوجي):

-1 * -1 = 1    ' موجب

بينما اذا ضربناه ثلاث مرات - اي عدد فردي- فان الناتج سالب :

-1 * -1 * -1 = -1

وبالتالي يمكن كتابة كود يضرب العدد سالب واحد في نفسه بحسب الرقم المدخل .... هكذا مثلا :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")
        Dim R As Integer = -1

        For I As Integer = 1 To N - 1
            R *= -1
        Next

        If R = -1 Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

اذا كنت تتفق معي فالكود السابق هو كود عبيط للتوضيح فقط والحل الحقيقي هو باستخدام الدالة Pow لرفع العدد سالب واحد الى الاس N (وبالتالي ضربه في نفسه)

بكلام آخر يمكنك استخدام علامة الرفع الى الأس في الفيجوال بيسك وهي ^ كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If ((-1) ^ N) = -1 Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

وكما هو الحال في الحلول الثنائية يمكن ان نشتق الكثير من الحلول المماثلة .. ونكتفي بهذا هنا .

----------------------------

حلول نصية Strings :

----------------------------

اقصد بالحلول النصية هي الحلول التي تعتمد على النصوص Strings في حل المسئلة بحيث تقوم بالتحويل الى نص ثم من خلاله وبطريقة معينة نستنتج كون العدد فرديا ام زوجيا .

خذ مثلا ... ان قسمة اي عدد على اثنين ينتج عنه اما عدد صحيح مثل 4 (ينتج 2) و12 ينتج 6 وهكذا ... بينما قسمة الاعداد الفردية ينتج عنه رقم صحيح بالاضافة الى الكسر (نُص) او (نقطة متبوعة بخمسة ) .... كالتالي 3 ينتج عنه 1.5 و 7 ينتج عنه 3.5 و 131 ينتج عنه 65.5 وهكذا .... فإذا حولنا الناتج من القسمة الى نص ثم قمنا فحص كونه ينتهي بـ "5." عن طريق EndsWith فسوف نصل الى كون العدد فردي .... كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If (N / 2).ToString.EndsWith(".5") Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

لاحظ ايضا كحل آخر انه مهما كان العدد وبأي نظام عد (عشري او ثنائي او ......) فانه سينتهي بارقام معينة اذا كان فرديا وبارقام اخرى اذا كان زوجيا ... خذ مثلا مهم كان الرقم فانه في النظام الثنائي سينتهي بواحد اذا كان فرديا فاذا كانت لدينا مثلا الدالة التالية :

    Function ToBinary(ByVal Num As Integer) As String
        Dim Bin As New System.Text.StringBuilder

        While Num > 0
            Bin.Append(Num Mod 2).ToString()
            Num \= 2
        End While

        Return StrReverse(Bin.ToString())
    End Function

فالدالة ToBinary ستقوم بتحويل الرقم الذي تدخلها الى نص يمثل مقابله بنظام العد الثنائي .. مثلا 5 سوف يصبح "101" و 22 سوف يصبح "10110" ........... واذا لاحظت فان الخمسة هو فردي لهذا انتهى بواحد و الـ 22 هو رقم زوجي لهذا انتهى بصفر.... وعليه فالاجابة كالتالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If ToBinary(N).EndsWith("1") Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

هذا بالنسبة لتحويله الى نظام العد الثنائي وكذلك الحال اذا اردنا فحصه بالنظام العشري مباشرة سنجد انه مهم كان الرقم فلابد ان ينهي باحد هذه الارقام 1 أو 3 أو 5 أو 7 أو 9 .... فمثلا لو قلت لك هل الرقم 8646729464527 هو قرم فردي ؟ ... سيكون الناتج نعم لانه انتهى بسبعة بغض النظر عن بقية الارقام وطوله وعرضه ... و بالتالي ... نسنتنتج التالي :

        Dim N As Integer = InputBox("ادخل أي عدد صحيح:")

        If "13579".IndexOf(N.ToString.Last) > -1 Then
            MsgBox("عدد فردي")
        Else
            MsgBox("عدد زوجي")
        End If

ومن هذا يمكن استنتاج الكثير من الحلول لجميع انظمة العد ...

على العموم كان هذا لنرى ان المسئلة بسيطة جدا على رغم من انها قد تصدمك في البداية اذا قلنا اجب باكثر من عشرة حلول مثلا على هذا السؤال ... وبالفعل ما قمنا به هنا سوية اكثر من العشرة بكثير ولازال هناك المزيد بالطبع.

ملاحظة كثير من الاجابات قد طرحها الشباب ولكن هذه كانت الاجابة قبل طرح السؤال وهي للفائدة

تحياتي

السلام عليكم ورحمة الله وبركاته

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع مشابهة