Guest User

Problem 12. * Zero Subset

a guest
Oct 15th, 2015
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.21 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5.  
  6. namespace _12.ZeroSubset
  7. {
  8.     class ZeroSubset
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //int[] numbers = { 3, -2, 1, 1, 8 };
  13.             //int[] numbers = { 3, 1, -7, 35, 22 };
  14.             //int[] numbers = { 1, 3, -4, -2, -1 };
  15.             int[] numbers = { 1, 1, 1, -1, -1 };
  16.             //int[] numbers = { 0, 0, 0, 0, 0 };
  17.  
  18.  
  19.             //TRIVIAL CASE - ALL ZEROS
  20.             int countZeros = 0;
  21.             for (int i = 0; i < numbers.Length; i++)
  22.             {
  23.                 if (numbers[i] == 0)
  24.                 {
  25.                     countZeros++;
  26.                 }
  27.             }
  28.             if(numbers.Length == countZeros)
  29.             {
  30.                 for (int i = 0; i < numbers.Length; i++)
  31.                 {
  32.                     if (i < numbers.Length - 1)
  33.                     {
  34.                         Console.Write("0 + ");
  35.                     }
  36.                     else
  37.                     {
  38.                         Console.WriteLine("0 = 0");
  39.                     }
  40.                 }
  41.                 return;
  42.             }
  43.            
  44.             //ALL OTHER CASES
  45.             int coefficientCombinations = (int) Math.Pow(2, numbers.Length) - 1;
  46.             for (int coefficients = coefficientCombinations; coefficients > 0; coefficients--)
  47.             {
  48.                 if(onlyOneBitSet(coefficients))
  49.                 {
  50.                     continue;
  51.                 }
  52.                 int sum = 0;
  53.                 int sequenceMembersCount = 0;
  54.                 for (int index = 0; index < numbers.Length; index++)
  55.                 {
  56.                     int bitIndex = (numbers.Length - 1) - index;
  57.                     int numberIndex = index;
  58.                     int coefficient = getBit(coefficients, bitIndex);
  59.                     sum += coefficient * numbers[numberIndex];
  60.                     if(coefficient == 1)
  61.                     {
  62.                         sequenceMembersCount++;
  63.                     }
  64.                 }
  65.                 int sequenceMembersCountSaved = sequenceMembersCount;
  66.                 if (sum == 0)
  67.                 {
  68.                     for (int i = 0; i < numbers.Length; i++)
  69.                     {
  70.                         int bitIndex = (numbers.Length - 1) - i;
  71.                         int numberIndex = i;
  72.                         int coefficient = getBit(coefficients, bitIndex);
  73.                         if (coefficient == 1 && sequenceMembersCount == sequenceMembersCountSaved)
  74.                         {
  75.                             Console.Write(numbers[numberIndex]);
  76.                             sequenceMembersCount--;
  77.                         }
  78.                         else if (coefficient == 1 && sequenceMembersCount < sequenceMembersCountSaved)
  79.                         {
  80.                             if (numbers[numberIndex] >= 0)
  81.                             {
  82.                                 Console.Write(" + " + numbers[numberIndex]);
  83.                             }
  84.                             else
  85.                             {
  86.                                 Console.Write(" - " + (-numbers[numberIndex]));
  87.                             }
  88.  
  89.                             if(sequenceMembersCount == 1)
  90.                             {
  91.                                 Console.WriteLine(" = 0");
  92.                             }
  93.                             sequenceMembersCount--;
  94.                         }
  95.                     }
  96.                 }
  97.             }
  98.         }
  99.  
  100.         static int getBit(int coefficients, int bitIndex)
  101.         {
  102.             return (coefficients >> bitIndex) & 1;
  103.         }
  104.  
  105.         static bool onlyOneBitSet(int coefficients)
  106.         {
  107.             int setBitCount = 0;
  108.             int highestBit = 31;
  109.             for(int i = 0; i <= highestBit; i++)
  110.             {
  111.                 if(((coefficients >> i) & 1) == 1)
  112.                 {
  113.                     setBitCount++;
  114.                 }
  115.             }
  116.             if(setBitCount == 1)
  117.             {
  118.                 return true;
  119.             }
  120.             else
  121.             {
  122.                 return false;
  123.             }
  124.         }
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment