Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*В булевой матрице обнулить столбцы,
- где нулей больше, чем единиц,
- в остальные записать единицы.*/
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- typedef unsigned int word;
- void outbool(word v, int n) //функция вывода
- {
- word mask=1;
- for(int i=0; i<n;++i,mask<<=1)
- {
- if(v&mask) printf("1");
- else printf("0");
- }
- printf("\n");
- }
- word inbool(int n) //функция ввода
- {
- word res=0,mask=1;
- char s[33];
- gets(s);
- for(int i=0;i<n;++i,mask<<=1)
- {
- if(s[i]=='1') res|=mask; //если символ равен 1, то дизъюнкция результата и маски
- }
- return res;
- }
- int weight_s(word m[],int n,int i) //функция подсчета веса в столбце. i номер столбца
- {
- word mask=1<<i;
- int res=0;
- for(int i=0;i<n;++i)
- {
- if(m[i]&mask)++res;
- }
- return res;
- }
- void all_null(word m[],int n, int i) //функция обнуления
- {
- int mask=~(1<<i); //инверсия. вместо нуля маска приобретает на нужном месте нуль, а в остальных случаях 1. поэтому столбец обнуляется, не изменяя остальные столбцы
- for(int i=0;i<n;++i)
- m[i]&=mask;
- }
- void all_one(word m[], int n, int i) //функция заполнения всего единицами
- {
- int mask=1<<i;
- for(int i=0;i<n;++i)
- m[i]|=mask;
- }
- void main(void)
- {
- const int n = 5;
- word m[n];
- srand(time(0));
- for(int i=0;i<n;++i)
- {
- m[i]=rand()%(1<<n);
- outbool(m[i],n);
- }
- int i=0,w=0;
- while(i<n)
- {
- w=weight_s(m,n,i);
- printf("%d ",w);
- if(n-w>w) all_null(m,n,i); // если нулей(число строк минус вес) больше единиц(вес), то обнуляем
- else all_one(m,n,i);
- ++i;
- }
- putchar('\n');
- for(int i=0;i<n;++i)
- outbool(m[i],n);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement