ما هو الخطأ في كود سي الخاص بي?(العوامل الأولية لعدد كبير)
-
21-12-2019 - |
سؤال
هل يمكنك مساعدتي من فضلك?
أنا مبتدئ في ج ولا يعمل الكود الخاص بي.
أحاول تحديد أكبر عامل رئيسي من 600851475143 وعندما أقوم بتشغيل التعليمات البرمجية ، فإنه لا يفعل شيئا.محاولة مع عدد أصغر ولكن يعمل.
long i;
for (i = 600851475143; i > 1; i--)
{
if (600851475143 % i == 0)
{
printf("%d\n", i);
}
};
المحلول
أولا وقبل كل شيء ، فإن الطريقة الصحيحة لطباعة long
ليس %d
لكن %ld
(د = عشري ، دينار = عشري طويل).إذا long
و int
لديك أحجام مختلفة على نظامك (وهو أمر غير معتاد) ، لن تتم طباعة النتائج بشكل صحيح لتبدأ بها.
المشكلة المحتملة التالية هي أن 600851475143
هو أكثر من يناسب في 32 bit
متغير ، حتى الآن long
ويضمن فقط أن تكون على الأقل 32 bit
.قد يكون أكبر من ذلك ، ولكن فقط 32 bits
مضمونة.لذلك هل أنت متأكد من أن long
كبيرة بما يكفي على النظام الخاص بك?
حاول
printf("%zu\n", sizeof(long));
إذا كان يقول 8
, ، كل شيء على ما يرام ، إذا كان يقول فقط 4
, long
لا يكفي وتحتاج إلى استخدام long long
بدلا من ذلك (و %lld
ل printf
, ، ليرة لبنانية = عشري طويل طويل).
أخيرا وليس آخرا, كنت على علم بأن حلقة الخاص بك يحتاج إلى القيام به 600 مليار التكرار,أليس كذلك?حتى إذا كان لديك نظام سريع جدا مع وحدة المعالجة المركزية سريع جدا وهذا سوف يستغرق بعض الوقت لإكمال.لذلك سوف ترى 600851475143
المطبوعة على الشاشة على الفور ، ولكن الامر سيستغرق بعض الوقت قبل انتهاء التعليمات البرمجية الخاصة بك (أو يجد المقسوم آخر ، في حال لم يكن هذا عدد أولي).
اختياريا:بدلا من الكتابة 600851475143
, ، يمكنك الكتابة 600851475143LL
لإعلام المترجم أنك تريد أن يكون هذا الرقم من النوع long long
.يبدو أن معيار ج 2011 لا يتطلب هذا لفترة أطول (يتم التعامل مع الأرقام تلقائيا على أنها long
أو long long
إذا لزم الأمر) ، ولكن أنا أعلم أن بيور إلى ج 2011 بعض المجمعين الأقل أصدر تحذيرا للأرقام أكبر من int
(أو أكبر من long
).
نصائح أخرى
ربما يكون نظام 32 بت.الرقم 600851475143
أكبر من 32 بت.
بدلا من long i
حاول:
long long i;
وبدلا من printf("%d\n", i);
حاول:
printf("%lld\n", i);
واستخدام 600851475143LL
بدلا من 600851475143
.
يمكنك بدء حلقةك بأكبر عدد صحيح أقل من أو يساوي الجذر التربيعي لعدد كبير.ثم يمكنك العثور على أزواج عامل تعمل من خلال الحلقة.اكتب وظيفة منفصلة للتحقق مما إذا كان رقم معين رئيسا.إذا كان العامل الأكبر للزوج رئيسا، فأعيده.إذا لم يكن الأكبر بشكل رئيسي، فحدد ما إذا كان أصغر رئيسا وإذا كان الأمر كذلك إرجاعه.