لماذا أفشل مشروع Euler #10؟
-
22-09-2019 - |
سؤال
السؤال هو: ابحث عن مجموع جميع الأعداد الأولية التي تقل عن مليوني.
لقد فعلت غربال 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