إيجاد العدد الأصغر من بين ثلاثة أعداد دون استخدام عوامل المقارنة
المطلوب في هذه المسألة هو إيجاد العدد الأصغر من بين ثلاثة أعداد دون استخدام عوامل المقارنة.
الطريقة الأولى: الطرح المتكرر
تتلخص هذه الطريقة في استخدام متغيّر للعد تبدأ قيمته من 0
، ثم طرح المقدار 1
من الأعداد الثلاثة وزيادة قيمة المتغيّر، والرقم الذي يصل إلى الصفر أولًا يكون هو الأصغر، وسيحمل المتغير العداد قيمة العدد الأصغر.
يجدر التنبيه إلى أنّ هذه الطريقة لا تعمل مع الأعداد السالبة.
تنفيذ الخوارزمية
- C++:
#include <bits/stdc++.h>
using namespace std;
int smallest(int x, int y, int z)
{
int c = 0;
while (x && y && z) {
x--;
y--;
z--;
c++;
}
return c;
}
// اختبار الدالة السابقة
int main()
{
int x = 12, y = 15, z = 5;
cout << "Minimum of 3 numbers is "
<< smallest(x, y, z);
return 0;
}
- بايثون:
def smallest(x, y, z):
c = 0
while ( x and y and z ):
x = x-1
y = y-1
z = z-1
c = c + 1
return c
# اختبار الدالة السابقة
x = 12
y = 15
z = 5
print("Minimum of 3 numbers is",
smallest(x, y, z))
- جافا:
class GFG {
static int smallest(int x, int y, int z)
{
int c = 0;
while (x != 0 && y != 0 && z != 0) {
x--;
y--;
z--;
c++;
}
return c;
}
// اختبار التابع السابق
public static void main(String[] args)
{
int x = 12, y = 15, z = 5;
System.out.printf("Minimum of 3"
+ " numbers is %d",
smallest(x, y, z));
}
}
الطريقة الثانية: استخدام العمليات الخاصة بالبتات
يمكن توظيف طريقة الطرح والإزاحة للمقارنة بين عددين صحيحين في عقد المقارنة بين ثلاثة أعداد صحيحة لإيجاد العدد الأصغر بينها.
تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:
- C++:
#include <bits/stdc++.h>
using namespace std;
#define CHAR_BIT 8
/* تحسب الدالة العدد الأصغر بين العددين المعطيين */
int min(int x, int y)
{
return y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1)));
}
/* تحسب الدالة العدد الأصغر بين ثلاثة أعداد */
int smallest(int x, int y, int z)
{
return min(x, min(y, z));
}
// اختبار الدالتين السابقتين
int main()
{
int x = 12, y = 15, z = 5;
cout << "Minimum of 3 numbers is " << smallest(x, y, z);
return 0;
}
- بايثون:
CHAR_BIT = 8
# تحسب الدالة العدد الأصغر بين العددين المعطيين
def min(x, y):
return y + ((x - y) & \
((x - y) >> (32 * CHAR_BIT - 1)))
# تحسب الدالة العدد الأصغر بين العددين المعطيين
def smallest(x, y, z):
return min(x, min(y, z))
# اختبار الدالتين السابقتين
x = 12
y = 15
z = 5
print("Minimum of 3 numbers is ",
smallest(x, y, z))
- جافا:
class GFG
{
static int CHAR_BIT = 8;
/* يحسب التابع العدد الأصغر بين العددين المعطيين */
static int min(int x, int y)
{
return y + ((x - y) & ((x - y) >>
((Integer.SIZE/8) * CHAR_BIT - 1)));
}
/* يحسب التابع العدد الأصغر بين ثلاثة أعداد */
static int smallest(int x, int y, int z)
{
return Math.min(x, Math.min(y, z));
}
// اختبار التابعين السابقين
public static void main (String[] args)
{
int x = 12, y = 15, z = 5;
System.out.println("Minimum of 3 numbers is " +
smallest(x, y, z));
}
}
الطريقة الثالثة: استخدام عامل القسمة
يمكن استخدام عامل القسمة لمعرفة العدد الأصغر بين عددين، فإن كانت قيمة القسمة (a/b)
مساوية للصفر، فإنّ b
أكبر من a
وإلا فإنّ a
سيكون العدد الأكبر.
تنفيذ الطريقة
تعرض الأمثلة التالية كيفية تنفيذ هذه الطريقة في عدد من لغات البرمجة:
- C++:
#include <stdio.h>
int smallest(int x, int y, int z)
{
if (!(y / x)) // "if (y < x)" مثل
return (!(y / z)) ? y : z;
return (!(x / z)) ? x : z;
}
int main()
{
int x = 78, y = 88, z = 68;
printf("Minimum of 3 numbers is %d", smallest(x, y, z));
return 0;
}
- بايثون:
def smallest(x, y, z):
if (not (y / x)): # "if (y < x)" مثل
return y if (not (y / z)) else z
return x if (not (x / z)) else z
# اختبار الدالة السابقة
if __name__== "__main__":
x = 78
y = 88
z = 68
print("Minimum of 3 numbers is",
smallest(x, y, z))
# This code is contributed
# by ChitraNayal
- جافا:
static int smallest(int x, int y, int z)
{
if ((y / x) != 1) // "if (y < x)" مثل
return ((y / z) != 1) ? y : z;
return ((x / z) != 1) ? x : z;
}
// اختبار التابع السابق
public static void main(String[] args)
{
int x = 78, y = 88, z = 68;
System.out.printf("Minimum of 3 numbers"
+ " is %d",
smallest(x, y, z));
}
}
مصادر
- صفحة Smallest of three integers without comparison operators في توثيق الخوارزميات في موقع GeeksforGeeks.