Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
386
Добавлен:
02.05.2014
Размер:
1 Мб
Скачать

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

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

Какой-то порядок в простых числах, несомненно, есть. Простые числа можно отсеять от составных решетом Эратосфена. Начнем с того, что 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();

}