
- •Void sort(int a[],int lt,int rt){
- •Int main(void){
- •Void sort(int a[],int lt,int rt){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Void sort(int a[],int lt,int rt){
- •Int main(void){
- •Int main(void){
- •Int main(void){
- •Void sort(int a[],int lt,int rt){
- •Int main(void){
- •Int *a; //массив
- •Int main(void){
- •Void sort(int a[],int lt,int rt){
- •Int main(void){
- •Int *a; //массив
№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];