Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
задачи на экзамен по эвм.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
53.6 Кб
Скачать

№1. #include <stdio.h>

#include <stdlib.h>

void sort(int a[],int lt,int rt){

int i=lt,j=rt,x=a[(lt+rt)/2],t;

do{

while(a[i]<x) i++;//находим следующий, который больше или равен

while(a[j]>x) j--;//находим следующий, который меньше или равен

if(i<=j){

t=a[i];a[i]=a[j];a[j]=t;

//когда встретимся (i==j, а этот момент обязвтельно наступит), то удобно сделать i++ и j-- [ключевое слово: обрезать]

i++;j--;

}

}while(i<=j);

if(lt < j) sort(a,lt,j);//сортируем первую половину

if(i < rt) sort(a,i,rt);//сортируем одну половину

//в двух половинах суммарно уже как минимум на 1 элемент меньше!

}

int main(void){

FILE *in=fopen("input.txt","r");

FILE *out=fopen("output.txt","w");

int n,i,prev,curr,next,j; //n-кол-во, i-указатель, j-указаетльЮ куда

int *a; //массив

fscanf(in,"%d",&n);

if(n==0){

fclose(in);

fclose(out);

return 0;//чтобы завершилась программа

}

a=(int*) malloc(n*sizeof(int));//выделение памяти под массив

prev=0;j=0;//перед первым элементов стоит 0

fscanf(in,"%d",&curr);

for(i=1;i<n;i++){//последовательно считываем все "next" элементы

fscanf(in,"%d",&next);

if(2*curr != prev + next)

a[j++]=curr;

prev=curr;

curr=next;

}

next=0;//после последнего элемента стоит нулевой

if(2*curr != prev + next)

a[j++]=curr;

n=j;

fclose(in);

sort(a,0,n-1);//сортировка [скоро будет нормальная =)]

fprintf(out,"%d\n",n);//вывод итогового массива

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

fprintf(out,"%d ",a[i]);

fprintf(out,"\n");

fclose(out);

return 0;

}

№2. #include <stdio.h>

#include <stdlib.h>

Void sort(int a[],int lt,int rt){

int i=lt,j=rt,x=a[(lt+rt)/2],t;

do{

while(a[i]<x) i++;//находим следующий, который больше или равен

while(a[j]>x) j--;//находим следующий, который меньше или равен

if(i<=j){

t=a[i];a[i]=a[j];a[j]=t;

//когда встретимся (i==j, а этот момент обязвтельно наступит), то удобно сделать i++ и j-- [ключевое слово: обрезать]

i++;j--;

}

}while(i<=j);

if(lt < j) sort(a,lt,j);//сортируем первую половину

if(i < rt) sort(a,i,rt);//сортируем одну половину

//в двух половинах суммарно уже как минимум на 1 элемент меньше!

}

char ok(int x){//удовлетворяет ли элемент x свойству ok?

//является ли старший байт зеркальным отражением младшего?

int i;

for(i=0;i<8;i++)//0 бит должен быть равен 31-му, 1-й - 30-му, ... , 7-й - (31-7) - му =)

if(((x>>i)&1) != ((x>>(31-i))&1)) return 0;//если не равны, то все плохо

return 1;//елси все равны, то хорошо

}

Int main(void){

FILE *in=fopen("input.txt","r");

FILE *out=fopen("output.txt","w");

int n,i,j;

fscanf(in,"%d",&n);

int *a=(int*) malloc(n*sizeof(int));

j=0;

for(i=0;i<n;i++){//последовательно считываем элементы, берем очередной только в том случае, когда он удовлетворяет свойству ok(x)

fscanf(in,"%d",&a[j]);

if(ok(a[j])) j++;

}

n=j;

sort(a,0,n-1);

fprintf(out,"%d\n",n);

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

fprintf(out,"%d ",a[i]);

fprintf(out,"\n");

fclose(in);

fclose(out);

return 0;

}

/*

5

-1431655851 1 -1 0 123123

//конец входного файла

-1431655851=10101010101010101010101001010101

-1=все 1

*/

№3. #include <stdio.h>

#include <stdlib.h>

int dig_sum(int x){//сумма цифр числа x

if(x<0) x=-x;

int res=0;

while(x){

res+=x%10;//прибавляем к результату очередную цифру

x/=10;//переходим к следующим цифрам

}

return res;

}

Void sort(int a[],int lt,int rt){

int i=lt,j=rt,x=a[(lt+rt)/2],t;

do{

while(dig_sum(a[i]) < dig_sum(x)) i++;//находим следующий, который больше или равен; сравниваютс по сумме цифр,....>(если уб)

while(dig_sum(a[j]) > dig_sum(x)) j--;//находим следующий, который меньше или равен; срафниваютс по сумме цифр,<

if(i<=j){

t=a[i];a[i]=a[j];a[j]=t;

//когда встретимся (i==j, а этот момент обязвтельно наступит), то удобно сделать i++ и j-- [ключевое слово: обрезать]

i++;j--;

}

}while(i<=j);

if(lt < j) sort(a,lt,j);//сортируем первую половину

if(i < rt) sort(a,i,rt);//сортируем одну половину

//в двух половинах суммарно уже как минимум на 1 элемент меньше!

}

Int main(void){

FILE *in=fopen("input.txt","r");

FILE *out=fopen("output.txt","w");

int n,i;

int *a;

fscanf(in,"%d",&n);

a=(int *)malloc(sizeof(int)*n);

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

fscanf(in,"%d",&a[i]);

sort(a,0,n-1);

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

fprintf(out,"%d ",a[i]);

fprintf(out,"\n");

fclose(in);

fclose(out);

return 0;

}

№4. #include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAXS 256//максимальное количество элементов в строке

typedef struct node{//элемент списка

struct node *next,*prev;//следующий и предыдущий элемент

char s[MAXS];//данные текущего элемента (в 4 задаче - строчка длины MAXS)

} node;

typedef struct list{

node *head;//выделенный элемент списка

int n;//количество элементов в списке

} list;

void swap(char s[],char t[]){//поменять местами 2 строки

char buf[MAXS];//вспомогательная переменная

strcpy(buf,s);//копируем в buf s

strcpy(s,t);//в s t

strcpy(t,buf);//в t buf

}

void init(list *lst){//инициализация списка

lst->head=0;//создается пустой список. совсем пустой

lst->n=0;

}

void link(node *u,node *v){//связать элементы списка u и v

u->next=v;

v->prev=u;

}

void ins(list *lst,char s[]){//добавление элемента в список

node *e=(node*)malloc(sizeof(node));//выделение памяти под 1(!!) элемент типа "node". никаких массивов здесь нет

strcpy(e->s,s);//копирование строчки s в элемент списка

// a->b = (*a).b

if(lst->n==0){//если список пустой

lst->head=e;//выделенный элемент (а других и нет :D) пусть будет равен только что созданному

e->next=e;//закольцовываем список. e<-e->e

e->prev=e;

lst->n++;

return;//завершаем выполнение функции

}

//если в списке естьэлементы, вставляем вновь созданный элемент списка после элемента head

link(lst->head->prev,e);// head->prev -> e

link(e,lst->head);//e -> head

lst->n++;

}

void rotate(list *lst){//перемещение головы списка на позицию вперед

lst->head=lst->head->next;

}

void print(list *lst,FILE *out){

int i;

for(i=0;i < lst->n; rotate(lst),i++)

fprintf(out,"%s\n",lst->head->s);//выводим то, что под головой

}

void sort(list *lst){//cортировка списка

int i,j,n=lst->n;

node *e;

for(i=0;i<n;rotate(lst),i++){//начинаем двигаться по списку, сдвигая голову n раз

e=lst->head->next;//просматриваем все элементы, начиная со следующего за головой

for(j=1;j<n-i;e=e->next,j++)//все, кроме тех, которые уже были головой

if(strcmp(e->s,lst->head->s)<0)//елси там храниться строчка, которая меньше, чем то, что в текущей голове

swap(e->s,lst->head->s);//меняем строчки местами

}

}

char s[MAXS];