Вот подсказка как минимум к одной проблеме. Посмотрите, что происходит при замене:
for (int c=0;c<=np;c++){
atotal += pa[c];
}
с:
for (int c=0;c<=np;c++){
bignum oldatotal = atotal;
atotal += pa[c];
if (atotal < oldatotal)
cout << "Hmmm: " << oldatotal << " " << atotal << endl;
}
Я получаю что-то вроде:
Hmmm: 4294819625 12858
Hmmm: 4294864122 123849
Hmmm: 4294717053 27802
Hmmm: 4294697657 51420
: : :
Hmmm: 4293781002 792849
Hmmm: 4294658253 1676602
Hmmm: 4293686116 710941
Hmmm: 4294706293 1737578
Total 2000000: 947402457
Array total: 947402457
Я не буду вдаваться в подробности, так как это головоломка, и я предполагаю, что вы хотите, чтобы она была хоть немного сложнее: -)
И да, вы правы (основываясь на вашем комментарии ниже), поэтому я сделаю ответ немного менее тупым, чтобы он был более полезным для других.
Тип unsigned long
недостаточно велик, чтобы содержать сумму всех этих простых чисел, поэтому он оборачивается.
Может ли он содержать фактические простые числа, я не проверял, но ответ в следующем параграфе также решит это.
Возможно, вы захотите попробовать переопределить bignum
как «больший» тип, например unsigned long long
, если он доступен.