Member 13579831 Ответов: 1

Я работаю над этой проблемой, когда даже я даю ввод больше, чем 5001, это даст мне неправильный ответ


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
long int prime(long int x);
long int prime(long int x)
{
   long int c;
 
   for ( c = 2 ; c <= x - 1 ; c++ )
   { 
      if ( x%c == 0 )
      return 0;
   }
   return 1;
}

int main() 
{
    long int n,i=1,j=1,k=1;
    long int sa=0;
    long int a,b;
    scanf("%li %li",&a,&b);
        
        for(i=1;i<=a;i++)
        {           
            for(k=1;k<=i;k++,j++)
            {
            if(a==i)
            {
                if(prime(j)==1)
                {
                    sa+=j;
                }
                    
                if(prime(j+1)==1)
                {
                      sa+=j+1;
                }
            
                    
                if(prime(j+2)==1)
                {
                    sa+=j+2;
                }
             break;
            }
            if(i==a){break;};
       }
    }
     j=1;
        
     for(i=1;i<=b;i++)
        {   
        for(k=1;k<=i;k++,j++)
        {
            if(b==i)
            {
                   if(prime(j)==1)
                   {
                       sa+=j;
                   }
                       
                   if(prime(j+1)==1)
                   {
                       sa+=j+1;
                   }
                    
                   if(prime(j+2)==1)
                   {
                       sa+=j+2;
                   }
                    break;
            }
        }
           
        if(i==b){break;}
        }   
    
        printf("%li",sa);
    return 0;    
     }


Что я уже пробовал:

я пробовал делать это с помощью while, но это не сработает

Richard MacCutchan

Что это значит? Что он должен делать и почему он этого не делает?

KarstenK

в вашей основной функции вы должны только зацикливаться до тех пор, пока c <= x / 2 не ускорит работу. Я тоже не понимаю вашего вопроса. Попробуйте добавить некоторые выходные данные отладки, чтобы лучше понять ваш код.

Rick York

Кроме того, лучший способ зацикливания для проверки простых чисел-это сначала проверить 2, затем 3, а затем увеличить на 2. Причина в том, что вы хотите протестировать 2,3,5,7, ... вместо 2,3,4,5,6, потому что это очень неэффективно. Да, вы будете тестировать больше, чем нужно, но только вдвое меньше, и именно в этом заключается преимущество.

1 Ответов

Рейтинг:
2

Patrice T

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
long int prime(long int x); // not necessary
long int prime(long int x)
{
  long int c;

  for ( c = 2 ; c <= x - 1 ; c++ )
  {
    if ( x%c == 0 )
    return 0;
  }
  return 1;
}

int main()
{
  long int n,i=1,j=1,k=1;
  long int sa=0;
  long int a,b;
  scanf("%li %li",&a,&b);

  for(i=1;i<=a;i++)
  {
    for(k=1;k<=i;k++,j++)
    {
      if(a==i)
      {
        if(prime(j)==1)
        {
          sa+=j;
        }

        if(prime(j+1)==1)
        {
          sa+=j+1;
        }


        if(prime(j+2)==1)
        {
          sa+=j+2;
        }
        break;
      }
      if(i==a){break;};
    }
  }
  j=1;

  for(i=1;i<=b;i++)
  {
    for(k=1;k<=i;k++,j++)
    {
      if(b==i)
      {
        if(prime(j)==1)
        {
          sa+=j;
        }

        if(prime(j+1)==1)
        {
          sa+=j+1;
        }

        if(prime(j+2)==1)
        {
          sa+=j+2;
        }
        break;
      }
    }

    if(i==b){break;}
  }

  printf("%li",sa);
  return 0;
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

Цитата:
когда даже я дам ввод больше чем 5001 он даст мне неправильный ответ

Что вы пытаетесь сделать с этой программой?
Покажите некоторые примеры входных данных, фактических выходных данных и ожидаемых выходных данных. И объясните их значение.
Насколько я вижу, эта программа не имеет смысла.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.