2013-11-02 2 views
0

Я знаю, что есть много тем по этому поводу в разных форумах тоже, но моя проблема заключается в следующем:Проект Эйлера 7 в C

Q 1. Для Эйлера задачи 7 (нахождение 10001st прайм) это мой код, который я думал самостоятельно.

#include <stdio.h> 
int main() 
{ 
    int i,j,k=0,m=0,num; 
    for(i=1;m<10001;i++) 
    { 
     k=0; 
     for(j=2;j<i;j++) 
     { 
      if(i%j!=0) 
       k++; 
     } 
     if(k+2==i) 
     {  
      m++; 
      num=i; 
     } 
    } 
    printf("%d %d",num,m); 
} 

Эта проблема должна отображать десятитысячный премьер (м < 10001), но она отображает 10001st прайм, почему это?

+1

Я не знаю, почему ваша программа делает то, что она делает, но Project Euler - это решение «умнее», а не «сложнее», вот несколько советов о поиске простых чисел от простого к сложному: 1) 'j' только нужно проверить до 'j * j <= i', как только вы пройдете этот момент, вы проверили каждый потенциальный делитель. 2) запустите 'j' в 3, а затем увеличьте' j' на 2, вам не нужно проверять каждый четный номер. 3) избавиться от 'm', просто продолжайте со следующего' i', когда вы найдете 'i% j == 0'. 4) Узнайте о [seives] (http://en.wikipedia.org/wiki/Sieve_of_Atkin) и используйте его. –

+0

Ну, вы можете использовать индукцию. Покажите, что он работает для 'm kay

ответ

3

Петля прерывается, когда m составляет 10001, что является причиной для ее печати 10001 для m. Так как m начинается с 0, он печатает 10001st prime. В вашем коде цикл работает от 0...10000 (10001 раз).

Изменить условие для m<10000 трасс т.е. петли из 0...9999 (10000 раз) и m в конце цикла будут иметь 10000.

0

Попробуйте реализовать Sieve of Eratosthenes, потому что он пропустит проверку всех кратных простого числа.