У меня проблема с выполнением моей программы.Я компилирую его с помощью gcc, используя: gcc -std=c89 -Wall -Wextra -lm main.c
.Та же проблема с clang, и я еще не пробовал с tcc, но буду, когда программа будет закончена.Я хотел бы, чтобы он был компилируемым с компилятором c89, это объясняет некоторые из моих выборов.У меня нет ошибок при компиляции, но проблема при выполнении.Как и то, что написано в некоторых моих комментариях в моем коде, при выполнении обычно у меня будет ошибка из-за деления на 0 (с переменной k), но я думаю, что у меня есть ошибка в "do ... while"цикл (потому что остальная часть моей функции проверена), и перед делением на k.Мне потребовалось несколько часов для отладки (особенно с помощью gdb (опция -g
добавить в команду компиляции и run -v
в gdb), но я все еще заблокирован.
/*librairies*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*main function*/
int main(){
int N, b, i, j, h, k;
int *t; /*pointer which will become an array (see in another after comment)*/
float l, m, a;
k = 0; /*Problem with k because we will see later an error*/
printf("Your number : ");
scanf("%d", &N);
if (N>1){
a = sqrt(N);
b = a; /*we convert float into int and it rounds under, normal*/
t = malloc(N * sizeof(int)); /*manual dynamic memory allocation for the array to respect C89*/
if (t==NULL){ /*t is null when you have not enough ram for a too big value for N*/
exit(0);
}
for (i=1;i<N;i++){ /*function to fill the array with 2,3..N*/
j = i + 1;
h = i - 1;
t[h] = j;
}
do{
if (t[k]==0){
k = k + 1;
} else{
for (i=1;i<N;i++){ /*problem nearby, because the division by 0 error does not come know at the execution = 0*/
h = i - 1;
if (t[h]!=0){
l = (float)t[h] / (float)k; /*It's going to be a problem because in the first loop, k = 0*/
m = l - (int)l;
if (m==0.0f){
t[h] = 0;
}
}
}
}
} while (k<b);
h = 0;
for (i=1;i<N;i++){
h = i - 1;
printf("%d\n", t[h]); /*printf to test before continuing the program*/
}
} else{
printf("Your number is not valid\n");
}
return 0;
}
Информация: эта программа простоПерсональный проект, чтобы проиллюстрировать для меня курс математики, который у меня был (о простых числах, а также о том, что для решения поставленной задачи и для решения k проблемы должен отображаться:
Your number: N /*N is a valid (positive integer) stdin input*/
0 /*and 0 until the k<b prime values are passed but I will make them to be displayed*/
a prime number
0
the next prime number
0
the next prime number
0
the next prime number
0
the next prime number
0
.
.
the last prime number (which can be N if N is a prime one)
Теорема, используемая для этой программы:
- Вы выбираете число
- Вы вычисляете его квадратный корень
- 1, здесь не учитывается простое число, поскольку оно делит все простые числа.
- Вы записываете все числа от 2 до числа, которое вы выбираете
- Вы удаляете все кратные простые числа (здесь используются простые числа под квадратным корнем) в любом месте записанного списка (здесь массивгде мы пишем 0, потому что я пока не знаю, как использовать структуры (список?).
- Все числа, которые остаются, являются простыми числами под выбранным вами (остальное? извините за мой плохой английский)
Спасибо.