Val_Kir

2lab2

Sep 26th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.97 KB | None | 0 0
  1. /* Побочная диагональ в строку с наименьшим весом. */
  2.  
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <stdlib.h>
  6.  
  7. typedef unsigned int word;
  8.  
  9. void outbool(word v, int n)
  10. {
  11.     word mask=1;
  12.     for(int i=0; i<n;++i,mask<<=1){
  13.         if(v&mask) printf("1");
  14.         else printf("0");
  15.     }
  16.     printf("\n");
  17. }
  18.  
  19. word inbool(int n)
  20. {
  21.     word res=0,mask=1;
  22.     char s[33];
  23.     gets(s);
  24.     for(int i=0;i<n;++i,mask<<=1){
  25.         if(s[i]=='1') res|=mask;
  26.     }
  27.     return res;
  28. }
  29.  
  30. int weight(word v)
  31. {
  32.     int res=0;
  33.     while(v)
  34.     {
  35.         if(v&1)++res;
  36.         v>>=1;
  37.     }
  38.     return res;
  39. }
  40.  
  41. void all_null(word m[],int n, int i){
  42.     int mask=~(1<<i);
  43.     for(int i=0;i<n;++i)
  44.         m[i]&=mask;
  45. }
  46.  
  47. void all_one(word m[], int n, int i){
  48.     int mask=1<<i;
  49.     for(int i=0;i<n;++i)
  50.         m[i]|=mask;
  51. }
  52.  
  53. void main(void)
  54. {
  55.     const int n=5;
  56.     int i=0,w=0,w_min=0,i_min=0;
  57.     word m[n],d[n],mask=1<<(n-1),v;
  58.     srand(time(0));
  59.  
  60.     for(int i=0;i<n;++i) //создание матрицы
  61.     {
  62.         m[i]=rand()%(1<<(n+1)-1);
  63.         outbool(m[i],n);
  64.     }
  65.     putchar('\n');
  66.    
  67.     w_min=weight(m[0]);
  68.  
  69.     for(i=0;i<n;++i) //поиск минимального веса
  70.     {
  71.         w=weight(m[i]);
  72.         printf("%d ",w);
  73.         if (w<w_min)
  74.         {
  75.             w_min=w;
  76.             i_min=i+1; //+1, потому что идем от о до 4, а матрица от 1 до 5
  77.         }
  78.     }
  79.     printf("w_min= %d , i_min= %d ",w_min,i_min);
  80.     putchar('\n');
  81.  
  82.     for(int i=0;i<n;++i,mask>>=1) //выделение побочной диагонали
  83.     {
  84.         d[i]=m[i]&mask;
  85.         outbool(d[i],n);
  86.     }
  87.     putchar('\n');
  88.  
  89.     for(int i=0;i<n;i++) //создание вектора из элементов побочной диагонали
  90.     {
  91.         d[0]=d[0]|d[i];
  92.     }
  93.     outbool(d[0],n);
  94.     putchar('\n');
  95.    
  96.     i_min--; // уменьшение минимального i, для поиска строки матрицы
  97.     m[i_min]=d[0];
  98.  
  99.     for(int i=0;i<n;i++)outbool(m[i],n);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment