Member 13188016 Ответов: 2

Сделать программу для печати простого числа


#include <stdio.h>
#include <stdlib.h>

 int main()
      {
   int prime[10000];
       int i,j;
      for(i=1;i<10000;i++)
    {
   prime[i]=1;
        }
         prime[1]=0;
        for(i=2;i<=100;i++)
       {
       if (prime[i]==1){
        for (j=i;i*j<10000;j++)
         {prime[i*j]=0;}
           }
         }
     for(i=1;i<10000;i++)
            {
        if( prime[i]==1 )
         {
       printf("%4d",i  );
      }

  }
   printf("\n");
   return 0;
}


сначала программа установила массив 1 до 10000 в значение 1, а затем установила prime[1] в 0
тогда этот код :
for(i=2;i<=100;i++)
 {
     if (prime[i]==1){
       for (j=i;i*j<10000;j++) {prime[i*j]=0;}
     }


следует устранить и сделать все из кратного числа
например, 2*2 = 4 и сделать простое число[4] в массиве равным 0
но почему простое число[6] также становится 0?

почему, когда я отлаживаю его в первый раз, почему вдруг все значения массива становятся 1 для нечетного и 0 для четного числа?? хотя уже установил его на 1?? что заставляет это стать 101010 в массиве?

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

почему, когда я отлаживаю его в первый раз, почему вдруг все значения массива становятся 1 для нечетного и 0 для четного числа?? хотя уже установил его на 1?? что заставляет это стать 101010 в массиве?

2 Ответов

Рейтинг:
2

Patrice T

Прежде всего, сделайте правильный отступ в вашем коде, это поможет вам читать.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int prime[10000];
	int i,j;
	for(i=1;i<10000;i++)
	{
		prime[i]=1;
	}
	prime[1]=0;
	for(i=2;i<=100;i++)
	{
		if (prime[i]==1){
			for (j=i;i*j<10000;j++)
			{
				prime[i*j]=0;
			}
		}
	}
	for(i=1;i<10000;i++)
	{
		if( prime[i]==1 )
		{
			printf("%4d",i  );
		}

	}
	printf("\n");
	return 0;
}

Цитата:
почему, когда я отлаживаю его в первый раз, почему вдруг все значения массива становятся 1 для нечетного и 0 для четного числа?? хотя уже установил его на 1?? что заставляет это стать 101010 в массиве?

Я не знаю, что вы называете "отладкой", но использование отладчика покажет, как ваш код делает то, что вы видите.
похоже, что когда вы удаляете кратные из простых чисел, вы также удаляете и это простое число.

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

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

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


Рейтинг:
1

OriginalGriff

Поскольку вы начинаете с индекса 1-и он равен нулю, вы устанавливаете его таким образом. Это означает, что он "не простой", поэтому вы его игнорируете.
Когда вы входите в цикл, ваш индекс равен 2 - и это все еще один, так что это простое число.
Вы входите во внутренний цикл, который устанавливает каждое кратное индекса в ноль, чтобы указать, что они не являются простыми. Потому что 2 - это первое четное число (по определению), которое удаляет все четные числа из вашего сита при установке prime[i*j]=0;
Таким образом, после первой итерации вашего внешнего цикла 1 не является простым, 2 является простым, 3 является простым, 4 не является, 5 является и так далее. Это и есть та картина, которую вы видите.


Я не понимаю внутренний цикл здесь в первой итерации он делает все четные числа равными нулю? For (j=i;i*j<10000;j++) {prime[i*j]=0} Index i=2 when enter the loop I=j=2 2*2=4< 10000 J++ This mean start j=2 then multiply it j=2*2 if it under 10000 then increment j with 1, so after it is 3*3=9 (?) i dont understand this part!!

Когда вы пишете for петля, она состоит из четырех частей:

for (initialization; condition; modification)
   execution statement
То execution statement очевидно-это код, который выполняется каждый раз, когда вы обходите цикл. В вашем случае это так:
{prime[i*j]=0;}

То initialization позволяет настроить начальные значения для цикла:
j = 1

То condition если тестируется каждый раз, когда вы собираетесь войти в цикл, и если это правда, цикл продолжается. Если он равен false, цикл завершается без выполнения execution statement снова.
i*j<10000
То modification если выполняется в конце каждого выполнения execution statement чтобы настроить цикл для следующей итерации:
j++

Итак, вы начинаете с установки j до значения i и повторяйте цикл до тех пор, пока i * j превышает (или равно) 10000.

Есть смысл?


а, понял!!!! это означает, что i=2, потому что инициализация и j =2, потому что условие истинно 4<10000, он выполнит оператор выполнения, тогда j будет увеличен до 3, так что i*j<10000 -> 6 <10000, поэтому все значение четного числа в массиве станет 0, тогда для i=j=3 он сделает значение кратного 3 равным 0 в массиве и так далее?

Это же де Банни! :большой палец вверх:


большое вам спасибо!!!!!!!!!!!!!!!!!!!!!!!!! для подробного объяснения!!!!!!!!!!!!!! надеюсь найти кого-то вроде тебя снова каждый раз, когда я путаюсь!!! лол
Пожалуйста!


Member 13188016

Я не понимаю внутренний цикл здесь в первой итерации он делает все четные числа равными нулю?
Для(К=Я;Я*й на<10000;к++) {премьер - [Я*ж]=0}
Индекс i=2 при входе в цикл
I=j=2
2*2=4 & lt;10000
Дж++
Это означает, что начните j=2, затем умножьте его j=2*2, если он меньше 10000, а затем увеличьте j на 1, так что после того, как он равен 3*3=9 (?), я не понимаю эту часть!!

Member 13188016

Я не понимаю часть внутренней петли
Для(j=i;j*i< 100000; j++)
{простое число[i*j]=0}
Он начинается с i=2
J=2;2*2< 10000(означает ли это, что 4 & lt;10000 true будет обрабатывать код или это означает, что он будет увеличиваться до достижения 10000?); j++
Как это удалить четное число до сих пор не понимаю

Member 13188016

Все еще не понимаю внутреннюю часть петли
Для (К=Я;Я*й на<10000;к++) {простое число(я*к)=0}
Означает i=j=2
2^2= & lt;10000 (означает, что если условие true будет обрабатывать последнее или будет увеличивать j++ до тех пор, пока оно не достигнет 10000?); j++
А если j увеличивается на 1, то должно быть 3*3=9, так почему же четное число все было исключено? Происходит ли исключение в первой итерации?

Member 13188016

а, понял!!!!
это означает, что i=2, потому что инициализация
и j =2
поскольку условие истинно 4< 10000, он выполнит оператор выполнения
тогда j будет увеличено до 3
Итак, i*j< 10000 -> 6 < 10000, поэтому все значения четного числа в массиве становятся 0
тогда для i=j=3 это сделает значение кратного 3 равным 0 в массиве
и так далее?

Member 13188016

большое вам спасибо!!!!!!!!!!!!!!!!!!!!!!!!! для подробного объяснения!!!!!!!!!!!!!! надеюсь найти кого-то вроде тебя снова каждый раз, когда я путаюсь!!!lol > & lt;