当前位置:   article > 正文

求整数数组的子集【C语言】

求整数数组的子集【C语言】

方法1:通过二进制位,因为n个整数数组的子集有2的n次方个,例如整数数组为{1,2,3},子集有2的3次方,8个;

期望的输出形式

其中需要了解关注的是

n&1判断最低位是否有数。如果一个子集为{2},利用二进制位2&1让其最低位空出来,依次类推。

n>>1结果是n/2

将n&1与n>>1结合就可以得到

若n=3(011); n&1=1 其最低位可以得到,n>>1 = 1;其次低位可以低到,

可以通过下面代码解读

  1. #include <stdio.h>
  2. int main(int argc, char const *argv[])
  3. {
  4.   int n=3;
  5.   int str1[3]={1,2,3}; // 定义一个数组
  6.   int str2[3]={0};
  7.   for (int i = 2; i >= 0; i--)
  8.   {
  9.       if(n&1)   // i=2 n=3 n&1=1 ; i=1 n=1 n&1=1 ; i=0 n=0 n&1=0
  10.       {
  11.           str2[i]=str1[i];// str2[2]=str1[2] ;str2[1]=str1[1] ;
  12.       }
  13.       n >>= 1; // n=1 n=0
  14.   }
  15.   for (int i = 0; i < 3; i++)
  16.   {
  17.       printf("%d ",str2[i]); // str2[2]=str1[2] ;str2[1]=str1[1] ; str[0]未被赋值
  18.   }
  19.    
  20.   return 0;
  21. }

此时得到了

以上述思想求整数数组的子集

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int main(int argc, char const *argv[])
  5. {
  6.   int nums[3] = {1,2,3};
  7.   int numsSize = 3;
  8.   int num = pow(2,numsSize);
  9.   int **returnColumnSizes;
  10.   returnColumnSizes = (int**)malloc(sizeof(int*)*num);
  11.   for(int i = 0; i < num; i++)  
  12.   {
  13.       returnColumnSizes[i] = (int*)malloc(sizeof(int)*numsSize);
  14.   }
  15.   for(int i = 0; i < num; i++)
  16.   {
  17.       for(int j = 0;j < numsSize; j++)
  18.       {
  19.           returnColumnSizes[i][j] = 0;
  20.            
  21.       }
  22.        
  23.   }  
  24.   for(int i = 0; i < num; i++)
  25.   {
  26.       for(int j = 0; j < numsSize; j++)
  27.       {
  28.           returnColumnSizes[i][j]=0;
  29.           printf("%d ",returnColumnSizes[i][j]);
  30.       }
  31.       printf("\n");
  32.   }
  33.   printf("---------\n");
  34.   for(int i = 0; i < num; i++)
  35.   {
  36.        
  37.       int n=i;
  38.       int k=0;
  39.       while (n)
  40.       {
  41.           if(n&1)
  42.           {
  43.               returnColumnSizes[i][k]=nums[k];
  44.           }
  45.           n >>= 1;
  46.            
  47.           k++;
  48.       }
  49.        
  50.        
  51.   }
  52.   printf("---------\n");
  53.    
  54.   for(int i = 0; i < num; i++)
  55.   {
  56.      
  57.       for(int j = 0; j < numsSize; j++)
  58.       {
  59.           if(returnColumnSizes[i][j]==0)
  60.           {
  61.               continue;
  62.           }
  63.           printf("%d ",returnColumnSizes[i][j]);
  64.            
  65.       }
  66.      
  67.       printf("\n");
  68.   }
  69.  
  70. }

本题本来打算写来回答力扣题78题求子集的,但是,才疏学浅,还是我不配。

最终结果将所有0都去掉了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/828389
推荐阅读
相关标签
  

闽ICP备14008679号