Ujjawal Taleja Ответов: 2

Хотите узнать сложность этой программы, новый способ для простых чисел


//simply we are going to use the approach that the numbers that are divisble by prime numbers are not prime and the others are prime.
#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,arr[100000],size=0,j,temp;           // array is for storing prime numbers
	scanf("%d",&n);        // we will be finding prime numbers between 2 to n (both inclusive) 
	arr[0]=2;              // we know that 2 is a prime number
	size++;                // we got 1 prime number so size of array gets incremented  
	for(i=3;i<=n;i++)
	{
		temp=pow(i,0.5);       //square root of the number (for which we are going to check is it prime or not)
		for(j=0;arr[j]<=temp;j++){
			if(i%arr[j]==0)
			break;
		}
		if(arr[j]>temp)
		{
			arr[size]=i;
			size++;
		}
	}
	for(i=0;i<size;i++)
	printf("%d \n",arr[i]);
	return 0;
}


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

я не очень много знаю о сложности, но я хочу использовать этот подход(если этот способ эффективен) в случае вопроса, связанного с простыми числами в соревнованиях

Kornfeld Eliyahu Peter

https://primes.utm.edu/prove/merged.html
(Вы хотите сказать, что нашли новый способ основания простых чисел? Я так не думаю... https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)

Dave Kreskowiak

МММ....этот код не находит простых чисел. Так какой смысл нотации "о большое" за это?

Если вы используете операцию по модулю для каждого тестируемого числа, вы делаете это неэффективно.

2 Ответов

Рейтинг:
2

Afzaal Ahmad Zeeshan

Сложность алгоритма означает, как связаны время и данные или входные данные на графике. Занимает ли алгоритм больше времени по мере увеличения объема данных или он остается прежним и т. д.

Существует обозначение, обозначение Big O (например, O(n)), которое используется для демонстрации этого. Для вашего алгоритма я бы рекомендовал вам попробовать его самостоятельно, построить график времени, данных, а затем посмотреть, увеличивается ли график или нет. Функция, которая делается на графике, - это сложность. Это самый простой способ найти общую сложность, потому что вы можете визуализировать ее, а затем сопоставить с ближайшей математической функцией-log (n), n2, n и т. д.

Для вашей помощи вот шпаргалка, которую вы можете использовать, чтобы проверить, какую сложность имеет этот алгоритм, Шпаргалка По Сложности Алгоритма Big-O[^].

Сложный способ найти сложность также можно найти здесь, Как найти временную сложность алгоритма-переполнение стека[^]


Рейтинг:
0

Patrice T

Цитата:
но я хочу использовать этот подход(если этот способ эффективен) в случае вопроса, связанного с простыми числами в соревнованиях

Мне очень жаль это говорить, но ваш подход неэффективен. Это даже очень наивно.

Первое, что приходит на ум, - это оптимизация, чтобы избежать тестирования четных чисел, потому что вы уже знаете, что " 2 " и никакое другое четное число не является простым.
заменять
for(i=3;i<=n;i++)

с
for(i=3;i<=n;i+=2)

Цитата:
я не очень много знаю о сложности

Чтобы получить представление о O, вы можете сделать синхронизацию вашей программы, нарисовать кривую и сравнить ее с известными кривыми типа x, x^2, x^3


вы должны изучить некоторые классические методы:
Сито Эратосфена - Википедия[^]
Сито Сундарама - Википедия[^] (по имени индийского математика)

Вычислительная сложность математических операций - Википедия[^]