ما هو الخطأ في كود سي الخاص بي?(العوامل الأولية لعدد كبير)

StackOverflow https://stackoverflow.com//questions/21028586

  •  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.

يمكنك بدء حلقةك بأكبر عدد صحيح أقل من أو يساوي الجذر التربيعي لعدد كبير.ثم يمكنك العثور على أزواج عامل تعمل من خلال الحلقة.اكتب وظيفة منفصلة للتحقق مما إذا كان رقم معين رئيسا.إذا كان العامل الأكبر للزوج رئيسا، فأعيده.إذا لم يكن الأكبر بشكل رئيسي، فحدد ما إذا كان أصغر رئيسا وإذا كان الأمر كذلك إرجاعه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top