المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : أقرب عدد أولي لعدد طبيعي


ثامر أبو بلقيس
15-08-2013, 08:00 PM
السلام عليكم
وليكن لدينا عددا طبيعيا نريد معرفة
أقرب عدد أولي لهذا العدد الطبيعي
أريد برنامجا أو أكوادا تحقق ذلك
سلامي :abc_138:

النصل القاطع
16-08-2013, 03:19 PM
أكتب برنامجا أو أكوادا تحقق ذلك
سلامي :abc_138:

لم أفهم ؟؟
هل هذا إستفسار ؟؟ أم إختبار ؟؟
عادة لا يكون الإستفسار بصيغة الأمر
و طلبك لكود أو (برنامج) لا يوحى بالإستفسار

عموما لم توضح الرقم الأولى المطلوب أكبر من رقم الأساس أم أصغر

فى المرات القادمة عندما لا يكون الغرض هو الإستفسار
يمكنك وضع العنوان بهذه الصيغة
تمرين :: "عنوان الموضوع"

مسموح بعمل التمارين فى هذا القسم مؤقتا
لحين فصلها فى الوقت المناسب لقسم مستقل

النصل القاطع
17-08-2013, 03:34 PM
هل تقصد مثل هذا ؟؟
http://im31.gulfup.com/gOj3I.jpg

يمكنك إنجاز البرنامج بواسطة الإضافة is_prim

تجدها هنا
http://www.abc4web.net/vb/showthread.php?t=27094

تلميح
الأعداد الأولية ذات القيمة الأكبر من رقم الأساس تحسب بحلقة Repeat
أما الأعداد الأولية ذات القيمة الأصغر من رقم الأساس تحسب بحلقة For

ثامر أبو بلقيس
17-08-2013, 04:33 PM
شكرا إليك بهذا الكود للإطلاع و التصحيح
function belkiss (x)
numbers = {}
for i = 2, x do
numbers[i] = i;
end
for i = 2, x do
for j = i+1, x do
if numbers[j] ~= 0 and Math.Mod(j, i) == 0 then numbers[j] = 0 end
end
end
max_prime_left, max_prime_right = 2, 2
for i = 2, x do
if numbers[i] ~= 0 then
local is_prime = true

local l = math.floor( i / 10 )
while l > 1 do
if numbers[l] == 0 then
is_prime = false
break
end
l = math.floor( l / 10 )
end
if is_prime then
max_prime_left = i
end
is_prime = true
local n = 10;
while math.floor(Math.Mod(i, 10) ) ~= 0 and n < x do
if numbers[ math.floor( Math.Mod(i, 10) ) ] ~= 0 then
is_prime = false
break
end
n = n * 10
end
if is_prime then
max_prime_right = i
end
end
end
end

النصل القاطع
17-08-2013, 05:56 PM
ما كل هذا الحلقات أخى ؟؟ أنت تستخدم إضافة و لا داعى لكل هذه الأكواد
و لماذا رجعت مرة أخرى للدالة فلور ؟؟
عموما ضع لنا كود إستغلال هذه الدالة ليتم مراجعتها (ضع كود زر الإستغلال)

الحل المقدم منى لك

لكل رقم طبيعى رقم أولى يسبقه و رقم أولى يليه
سأعطيك كود إحضار أقرب رقم أولى يلى الرقم المدخل
سأعطيك كود الزر Next prim up الموجود فى الصورة بمشاركتى السابقة

قم بعمل مشروع جديد
تأكد من وجود الإضافة is_prim

ضع 2 إنبوت و دعهم بالأسماء الإفتراضية (لا تعدل أسماؤهم)
ضع زر

فى إسكربت الزر ضع

x = Input.GetText("Input1");
x = String.ToNumber(x);
repeat
x=x+1
prim = is_Prime_num(x);
until prim==true
Input.SetText("Input2", x);

أكتب الرقم فى إنبوت 1
إضغط الزر
يظهر الرقم الأولى الأقرب فى إنبوت 2

منتظر ردك
و أعتقد أنه بات من السهل إحضار
أقرب رقم أولى يسبق الرقم المدخل لو إتبعت نفس المنوال لكن بحلقة for

الكود جاهز لدى

كذلك كود إحضار الأرقام الأولية المحصورة من x إلى y
و الذى تم إنتاج المرفق فى هذه المشاركة به فى زمن قدره 3 دقائق

لكن الفائدة هنا أن نتعلم إتقان البرمجة و ليس أخذ الحلول الجاهزة

الآن أنا موجود
غدا
من يدري ؟؟

راجع المرفق

ثامر أبو بلقيس
17-08-2013, 06:15 PM
لمراجعة كود الدالة المرفقة
أكتب الرقم في الانبوت 1 لتطلع النتائج في الانبوت 2 و الانبوت 3
x=Input.GetText("Input1");
x = String.ToNumber(x);
belkiss (x)
Input.SetText("Input2", max_prime_right);
Input.SetText("Input3", max_prime_left);


====================================
لقد قمت بتجربة ما أرسلته و فعلا عمل متكامل جربت على أعداد صغيرة و النتائج جد ممتازة في الحصول على العدد الأولى الموالي بارك الله فيك :abc_052:

ثامر أبو بلقيس
17-08-2013, 06:22 PM
هل عند التغير في الكود المرسل هنا
x=x-1
ساتحصل على الرقم الذي سبق

النصل القاطع
17-08-2013, 06:27 PM
لقد قمت بتجربة ما أرسلته و فعلا عمل متكامل جربت على أعداد صغيرة و النتائج جد ممتازة في الحصول على العدد الأولى الموالي بارك الله فيك :abc_052:

عليك بتجربة الأعداد الكبيرة أيضا
الكود سريع حتى 11 منزلة
أى
الكود سريع (أقل من ثانية ) حتى 99999999999
بعد ذلك يستغرق بضع ثوانى
التباطؤ الحقيقى يظهر عند 13 منزلة أى 9999999999999

لا أعتقد أنك ستصل لهذه المنازل

لن أتكلم عن الكود خاصتك حتى لا تعتقد أننى أقارن
فقط ملحوظة

إعتمد على الكود المقدم منى لضمان السرعة
نتائج دالتك غير صحيحة و لا أنصحك بالإعتماد عليها

النصل القاطع
17-08-2013, 06:31 PM
هل عند التغير في الكود المرسل هنا
x=x-1
ساتحصل على الرقم الذي سبق

لا
و سبق و أخبرتك أنك ستقوم بعمل حلقة for
و قبل أن تطرح أكوادا معقدة دعنى أوضح لك أن كود الزر كاملا بما فيه إستحضار القيمة و حسابها و إظهارها لن يتجاوز العشرة أسطر
فقط دقق فى صياغة حلقة for
بالتوفيق

ثامر أبو بلقيس
17-08-2013, 06:33 PM
فعلا اعتمدت الكود و الاضافة كحل نهائي
لمشكلتي مع الأعداد الأولية
يبدأ البطؤ في المنزلة 16 و فعلا لا أحتاج أرقاما كبيرة
بارك الله فيك :abc_138:

النصل القاطع
17-08-2013, 06:40 PM
فعلا اعتمدت الكود و الاضافة كحل نهائي
لمشكلتي مع الأعداد الأولية
يبدأ البطؤ في المنزلة 16 و فعلا لا أحتاج أرقاما كبيرة
بارك الله فيك :abc_138:

و بارك الله فيك أخى
و أنا ذكرت 13 منزلة وفقا لمواصفات جهازى المتوسطة و ليس وفقا لجهازك المتقدم نسبيا عن جهازى
لا أعتقد أنك تحتاج للرقم الأولى الأقرب الأدنى
الأدنى أم الأعلى كلاهما سيفى بالغرض بالنسبة لك (أنا إستخدمته لنفس الغرض الذى أتوقع أنك تريده لأجله)
بالتوفيق

ثامر أبو بلقيس
17-08-2013, 09:28 PM
أجدد شكري جزاك الله كل خير ووفقك في كل مساعيك :abc_152:

ثامر أبو بلقيس
20-08-2013, 06:34 PM
كذلك كود إحضار الأرقام الأولية المحصورة من x إلى y
و الذى تم إنتاج المرفق فى هذه المشاركة به فى زمن قدره 3 دقائق

لكن الفائدة هنا أن نتعلم إتقان البرمجة و ليس أخذ الحلول الجاهزة

الآن أنا موجود
غدا
من يدري ؟؟



السلام عليكم أخي خالد بخصوص هذه الجزئية التي أشرت لها
حاول استغلال القيم المخزنة
كأن تستغل local prime :abc_088:

وللقيام بالتجربة لمن يهمه الأمر
ازرع الكود التالي تحت زر معين
local n =10000
local prime = {}
local primes = {}

for i = 2, n do prime[i] = true end

for i = 2, n do
if prime[i] then
primes[#primes+1] = i
for j = i*2, n, i do prime[j] = false end
end
end


Input.SetText("Input1",table.concat(primes, " "));

لاحظ أنه تم تحديد استخراج كل الأعداد الأولية إلى غاية 10000 مثلا
وضع أنبوت 1 و عاين النتائج
هل لك استخراج بطريقة أخرى للاستفادة أكثر
سلامي و احترامي :abc_152: