Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Ironman666

Малък проблем относно една задача на C

Препоръчан отговор


Условието на задачата е да се въведат n на брой числа пример 1 2 3 4 5 6 7 8 9 10 11 12.От тези числа да се изведат само простите.Направих програмата но тя работи само с едноцифрени числа т.е. 1 2 3 4 5 6 7 8 9.Може ли някой да помогне така че да работи и с двуцифрени ?

 

#include <stdio.h>
#include <stdlib.h>
 
char c;
 
struct ArrayList
{
int *array;
int size;
int capacity;
};
 
typedef struct ArrayList ArrayList;
 
void list_in(ArrayList *);
void list_add(ArrayList *, int);
void list_remove(ArrayList *);
void list_print(ArrayList *);
void list_index_of(ArrayList *, int);
int check_prime(int check);
 
int main()
{
ArrayList *list = (ArrayList *)malloc(sizeof(ArrayList));
list_in(list);
 
while((c = getchar()) != EOF)
{
int num = c - '0';
if(num >= 0 && num <= 9)
{
int result = check_prime(num);
if(result == 1)
{
list_add(list, num);
}
}
}
 
list_print(list);
 
return 0;
}
 
void list_in(ArrayList *list)
{
printf("Initializing the list..n");
list->array = (int *)malloc(sizeof(int) * 5);
list->size = 0;
list->capacity = 5;
}
 
void list_add(ArrayList *list, int element)
{
if(list->size == list->capacity)
{
list->array = (int*)realloc(list->array, sizeof(int)*list->capacity+10);
list->capacity += 10;
}
 
list->array[list->size] = element;
list->size++;
}
 
void list_print(ArrayList *list)
{
if(c != 13)
{
printf("nPrinting list.n");
}
else
if(c == 13)
{
printf("Printing list.n");
}
 
int i = 0;
for(i = 0; i < list->size; i++)
{
printf("%d ", list->array);
}
printf("n");
}
 
int check_prime(int check)
{
int i = 0;
for(i = 2; i <= check; i++)
if(check % i == 0 && check != i)
{
return 0;
}
else
if(check % i == 0 && check == i)
{
return 1;
}
}
}
 

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

трябва да проверявате за край на ред, защото вие ограничавате числата до един символ

Или ползвайте друга функция (gets например) или ги натрупвайте до ентър или какъвто е делимитера!

while((c = getchar()) != EOF){int num = c - '0';if(num >= 0 && num <= 9){int result = check_prime(num);

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

@Ironman666 много сложно го даваш като може и по-просто

#include <stdio.h>int prime(int a) {    int i;    if (a < 0) a = -a;    if (a % 2 == 0) return 0;    for (i=3; i< a/2; i+=2)         if (a % i == 0) return 0;    return 1;}int main () {    int a;     do {         scanf("%d", &a);         if (prime(a)) printf("%dn", a);      } while (eof());}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

@Ironman666 много сложно го даваш като може и по-просто

#include <stdio.h>int prime(int a) {    int i;    if (a < 0) a = -a;    if (a % 2 == 0) return 0;    for (i=3; i< a/2; i+=2)         if (a % i == 0) return 0;    return 1;}int main () {    int a;     do {         scanf("%d", &a);         if (prime(a)) printf("%dn", a);      } while (eof());}

Ако ми разрешиш едно дребно допълнение:

В цикъла за проверка на делимост може да се проверява от 3 до sqrt(a) което може при големи числа да намали съществено броя на проверките :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

да знам, само дето C-то няма целочислено коренуване и трябва да се минава през double,

а и май отрицателните числа и 1 също не са прости по дефиниция.

#include <stdio.h>int prime(int a) {    int i;    if (a < 2) return 0;    if (a % 2 == 0) return 0;    for (i=3; i<a/2; i+=2)         if (a % i == 0) return 0;    return 1;}int main () {    int a;     do {         scanf("%d", &a);         if (prime(a)) printf("%dn", a);      } while (eof());}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

да знам, само дето C-то няма целочислено коренуване и трябва да се минава през double.

и друго има не съм сигурен дали 1 е просто число, ако не е - трябва да се добави проверка дали а е 1.

От математиката имам спомени че едно не се брои нито просто нито с делители. а за коренуването: да, така е, но операцията може да се изнесе преди цикъла и да намали съществено броя на проверките :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

#include <stdio.h>

int prime(int a) {
int i;
if (a < 2) return 0;
if (a % 2 == 0) return 0;
for (i=3; i<a/2; i+=2)
if (a % i == 0) return 0;
return 1;
}

int main () {
int a;
do {
scanf("%d", &a);
if (prime(a)) printf("%dn", a);
} while (eof());
}

ММ може ли да ми кажете къде трябва да пипна, че да ми печати и 2 а не от 3?Къде ли не редактирах и пак ми почва печатеното от 3 за простите числа а то трябва от 2 Мерси предварително :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това:

int main () {int a;do {scanf("%d", &a);if (prime(a)) printf("%dn", a); } while (eof());}

Става така:

int main () {int a;printf("%dn", 2);do {scanf("%d", &a);if (prime(a)) printf("%dn", a); } while (eof());}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

...ММ може ли да ми кажете къде трябва да пипна, че да ми печати и 2 а не от 3?Къде ли не редактирах и пак ми почва печатеното от 3 за простите числа а то трябва от 2 Мерси предварително :)

Виноват, двойката съм я пропуснал :( 

int prime(int a) {int i;   if (a < 2) return 0;    if (a < 4) return 1;   if (a % 2 == 0) return 0;   for (i=3; i<a/2; i+=2)        if (a % i == 0) return 0;   return 1;}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Мерси за помощта и на двамата оправих се със задачата :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ако ми разрешиш едно дребно допълнение:

В цикъла за проверка на делимост може да се проверява от 3 до sqrt(a) което може при големи числа да намали съществено броя на проверките :)

Определено, само дето днеска  с пробване се оказа че едно изчисление на sqrt() е по-бавно от многократно умножение,

Но и двете са доста по-бързи от проверката до а/2 и (дори до а/3)

с многократно * 436 клика

със sqrt() 593

до a/3 17968

до a/2 26103

#include <stdio.h>#include <time.h>int prime(unsigned a) {    int i;    if (a < 2) return 0;    if (a < 4) return 1;    if (a % 2 == 0) return 0;    for (i=3; i<=a/3; i+=2)         if (a % i == 0) return 0;    return 1;}int main () {    clock_t t;    unsigned a, p, br=0;    t = clock();    for (p=0; p<100; p++) {        br=0;        for (a=0; a<65000; a++)            if (prime(a)) br++;    }     t = clock()- t;    printf("%u prosti za %un", br, t);    system("pause");    }
int prime(unsigned a) {    int i, j;    if (a < 2) return 0;    if (a < 4) return 1;    if (a % 2 == 0) return 0;    j = (int) sqrt( (float) a);    for (i=3; i<=j; i+=2)         if (a % i == 0) return 0;    return 1;}
int prime(unsigned a) {    int i;    if (a < 2) return 0;    if (a < 4) return 1;    if (a % 2 == 0) return 0;    for (i=3; i*i <= a; i+=2)         if (a % i == 0) return 0;    return 1;}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

×
×
  • Добави ново...