سؤال

السؤال هو: ابحث عن مجموع جميع الأعداد الأولية التي تقل عن مليوني.

لقد فعلت غربال Erastothenes إلى حد كبير ، ويبدو أن البرنامج أدناه يعمل مع عدد صغير ، أي تحديد الحد الذي ينتج فيه 10L 17 كإجابة.

لقد قدمت 1179908154 كإجابة ، كما أنتجتها البرنامج التالي ، وكان غير صحيح.

الرجاء المساعدة في الإشارة إلى المشكلة. شكرًا.

#include <stdio.h>

#define LIMIT 2000000L
int i[LIMIT];

int main()
{
    unsigned long int n = 0, k, sum = 0L;
    for(n = 0; n < LIMIT; n++)
        i[n] = 1;
    i[0] = 0;
    i[1] = 0;

    unsigned long int p = 2L;

    while (p*p < LIMIT)
    {
        k = 2L;
        while (p*k < LIMIT)
        {
            i[p*k] = 0;
            k++;
        }
        p++;
    }

    for(n = 0; n < LIMIT; n++)
        if (i[n] == 1)
        {
            sum += n;
        }
    printf("%lu\n",sum);

    return 0;
}
هل كانت مفيدة؟

المحلول

يمكنك حساب الأعداد الأولية بشكل صحيح ، لكن المبلغ كبير جدًا (أكثر من 2^32) ولن يتناسب مع طول 32 بت غير موقّع. يمكنك استخدام رقم 64 بت (long long على بعض المترجمين) لإصلاح هذا.

نصائح أخرى

يبدو أن منطقك صحيح ، لكنك تعبث مع أنواع البيانات ونطاقاتها. تحقق مما إذا كان هذا يعمل أم لا:

#include <stdio.h>

#define LIMIT 2000000
int i[LIMIT];

int main()
 {
   long long int n = 0, k, sum = 0;
  for(n = 0; n < LIMIT; n++)
    i[n] = 1;
  i[0] = 0;
  i[1] = 0;

  long long int p = 2;

  while (p*p < LIMIT)
  {
    k = 2;
    while (p*k <LIMIT)
    {
        i[p*k] = 0;
        k++;
    }
    p++;
  }

  for(n = 0; n < LIMIT; n++)
    if (i[n] == 1)
    {
        sum += n;
    }
  printf("%lld\n",sum);

  return 0;
}

Output :142913828922

قد تجد أيضًا أنك تحتاج إلى استخدام مفتاح التحويل البرمجي -std = C99 أيضًا. فعلت مع GCC (GCC) 3.4.5 (Mingw-Vista Special R3).

بمعنى آخر

GCC -Wall -STD = C99 -O مشكلة 10.C.C

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