/*
Волк А.В. гр 720603 Вариант №4
Напечатать все простые числа, не превосходящие заданное число M.
Для ускорения вычислений полезно завести таблицу для уже найденных простых чисел и проверять делимость
очередного числа на числа из этой таблицы. Четные числа, естественно, не рассматривать.
Таблица понадобится менее чем на Решение задачи оформит в виде функции, которая получает в качестве
параметров число M, указатель на массив, в который будут помещаться найденные простые числа.
*/
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
int Check(int x){
int ok=1;
if(x>1000000){
ok=0;
puts("Too Much!");
}
if(x<2){
ok=0;
puts("Must be more than 1!");
}
return ok;
}
int CheckInt(char *x)
{
int symbols = 0;
int digits = 0;
int ok=0;
while(*x !=0){
symbols++;
if(isdigit(*x++))
digits++;
}
if(symbols==digits)
ok=1;
if(symbols>7){
puts("Symbols there is more than possible");
ok=0;
}
return ok;
}
/****************************************
//функция для нахождения простого числа
/******************************************/
int *Prime(int n){
int i,x,c,a;
int *s;
int k=n;
s = (int) *calloc(k, sizeof(s));
s = (int *) calloc(k, sizeof(s));
if(!s){
puts("The file is empty. Probably not enough memory. Try again.");
return 0;
}
else{
s[0]=2;
x=3;
for (i=1; i<=k; ++i){
if(!s[i]){
c=i;
break;
}
}
while (x<=n){
//a=0;
for (a=i=0;i<c;i++)
if (!(x%s[i]))
break;
else
a++;
if (a==c)
{
s[c]=x;
c++;
}
x+=2;
}
return s;
free (s);
}
}
void main()
{
char m[];
int i=0,n=0,ok;
int *s;
puts("Enter number!");
do {
do {
ok=1;
gets(m);
if(!CheckInt(m)){
ok=0;
puts("Incorrect input. Try again.");
continue;
}
n=atoi(m);
if(!Check(n)){
ok=0;
puts("Incorrect input. Try again.");
continue;
}
} while (!ok);
s=Prime(n);
} while(!s);
puts("Prime numbers:");
while (s[i]>0) //вывод таблицы
printf("%d ", s[i++]);
//i++;
printf("\nQuanity of prime numbers: %d\n",i);
getch();
}