Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на языке C_4.docx
Скачиваний:
44
Добавлен:
25.03.2016
Размер:
299.55 Кб
Скачать

Поиск узлов из простых чисел

Всякий, кто изучает простые числа, бывает очарован ими и одновременно ощущает собственное бессилие. Определение простых чисел так просто и очевидно. Найти очередное простое число так легко, разложение на простые сомножители - такое естественное действие! Почему же тогда простые числа столь упорно сопротивляются нашим попыткам постичь порядок и закономерности их расположения? Может быть, в них вообще нет порядка, или же мы так слепы, что не видим их?

Какой-то порядок в простых числах, несомненно, есть. Простые числа можно отсеять от составных решетом Эратосфена. Начнем с того, что 2 - простое число. Теперь выбросим все большие четные числа (делящиеся на 2 ). Первое из уцелевших за двойкой чисел, 3, также должно быть простым. Удалим все его кратные, останется 5. После удаления кратных пяти останется 7. Будем продолжать в том же духе. Все числа, прошедшие через решето, будут простыми. Это регулярная, хотя и медленная процедура находит все простые числа. Оказывается, что все известные методы построения таблицы простых чисел - не что иное, как вариации метода решета. Эйлер придумал формулу x2+x+41. Для всех x от нуля до 39 эта формула дает простые числа. Однако, никакая полиномиальная формула не может давать подряд бесконечный ряд простых чисел. Формула Эйлера терпит фиаско при x=40. Закономерность появления простых чисел проявляется, когда целые числа отображаются на плоскость (или в пространство).

Напишем программу, которая отображает целые числа на плоскость некоторым регулярным образом, и отмечает на рисунке места, где находятся простые числа:

// Построить матрицу А(15x15)таким образом:

// А(7,7)=1, затем, по спирали против

// часовой стрелки, увеличивая значение

// очередного элемента на единицу и

// выделяя все простые числа красным цветом

// заполнить матрицу

#include <stdio.h>

#include <conio.h>

void main(void)

{

clrscr();

int mas[15][15];

int n=1,x=6,y=6,k=1;

int i,j;

while(1){

mas[x][y]=k++;

switch(n){

case 1: x++;break;

case 2: y--;break;

case 3: x--;break;

case 4: y++;break;

}

if(x==15) break;

if(x==y && x<6) n=4;

else if(x+y==12 && x<6) n=1;

else if(x+y==12 && x>6) n=3;

else if(x==y+1 && x>6) n=2;

}

for(i=0;i<15;i++)

{

for(j=0;j<15;j++)

{

textcolor(12);

if(mas[j][i]>2)

for(k=2;k<mas[j][i];k++)

if(mas[j][i]%k==0) textcolor(15);

cprintf("%3d ",mas[j][i]);

}

printf("\n");

}

getch();

}

Матрица инцидентности

Матрица I(G) размером n x m ( n - число вершин, m - число ребер/дуг графа G ), ( i, j )-й элемент, которой равен 1, если вершина ni инцидентна ребру eij в неориентированном графе или если ni есть начало дуги ej равен -1, если вершина ni есть конец дуги ej (только для ориентированных графов), и равен 0 в остальных случаях.

В данной задаче задается граф и строится его матрица инцидентности:

//Построение матрицы инцидентности

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <iostream.h>

struct elem

{

int num; /* Номер вершины */

int suns; /* Количество сыновей */

char str[20]; /* Строка с номерами сыновей */

elem *next; /* Указатель на следующую вершину */

} *head, *w1, *w2;

int connected(int i, int j)

{

int k;

char *str1;

w2 = head;

if(i == j) return 0;

for(k=1; k<i; k++)

w2 = w2->next;

if( strchr(w2->str, j) ) return 1;

return 0;

}

void main()

{

int tops;

int i,j,k,l;

char *str1;

clrscr();

printf("Введите количество вершин \n");

scanf("%d", &tops);

head = (elem *)malloc(sizeof(elem));

head->num = 1;

head->suns = 0;

head->str[0] = '\0';

head->next = NULL;

w1 = head;

for(i=2;i<=tops;i++) {

w2 = (elem *)malloc(sizeof(elem));

w2->num = i;

w2->suns = 0;

w2->str[0] = '\0';

w2->next = NULL;

w1->next = w2;

w1 = w2;

}

w1 = head;

for(i=1; i<=tops; i++) {

// clrscr();

printf("Введите количество путей из вершины

%d\n", i);

scanf("%d", &k);

for(j=1; j<=k; j++) {

printf("Введите связь %d\n", j);

scanf("%d", &l);

if((l<=0) || (l > tops)) {

printf("Такой вершины нет,

повторите попытку\n");

l = 0;

j--;

continue;

}

w1->str[w1->suns++] = l;

w1->str[w1->suns] = '\0';

if(w1->suns == 49) {

printf("Слишком много связей !");

exit(1);

}

}

w1 = w1->next;

}

clrscr();

printf("\n\n Матрица инциндентности :\n");

for(i=1; i<=tops; i++) {

printf("\n %d) ", i);

for(j=1; j<=tops; j++) {

printf("%d ", connected(i, j));

}

}

printf("\n\n Нажмите любую клавишу...");

getch();

}