Guest User

find formula

a guest
Nov 25th, 2011
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. class Program
  6. {
  7.     public static IEnumerable<string> Formula(double[] numbers, bool[] used, double wanted, double last = 0)
  8.     {
  9.         if (Math.Abs(last - wanted) < 0.001)
  10.         {
  11.             yield return "";
  12.             yield break;
  13.         }
  14.         for (int i = 0; i < numbers.Length; i++)
  15.         {
  16.             if (!used[i])
  17.             {
  18.                 used[i] = true;
  19.                 var a = numbers[i];
  20.                 for (int j = 0; j < numbers.Length; j++)
  21.                 {
  22.                     if (!used[j])
  23.                     {
  24.                         var b = numbers[j];
  25.                         if (b > a || (a == b && j > i))
  26.                         {
  27.                             numbers[j] = a + b;
  28.                             foreach (var s in Formula(numbers, used, wanted, numbers[j]))
  29.                                 yield return a + " + " + b + " = " + (a + b) + "\n" + s;
  30.                             numbers[j] = a * b;
  31.                             foreach (var s in Formula(numbers, used, wanted, numbers[j]))
  32.                                 yield return a + " * " + b + " = " + (a * b) + "\n" + s;
  33.                         }
  34.                         numbers[j] = a - b;
  35.                         if (numbers[j] >= 0)
  36.                             foreach (var s in Formula(numbers, used, wanted, numbers[j]))
  37.                                 yield return a + " - " + b + " = " + (a - b) + "\n" + s;
  38.                         numbers[j] = a / b;
  39.                         if (Math.Abs(numbers[j] - (int)numbers[j]) < 0.00001)
  40.                             foreach (var s in Formula(numbers, used, wanted, numbers[j]))
  41.                                 yield return a + " / " + b + " = " + (a / b) + "\n" + s;
  42.                         numbers[j] = b;
  43.                     }
  44.                 }
  45.                 used[i] = false;
  46.             }
  47.         }
  48.     }
  49.     static void Main(string[] args)
  50.     {
  51.         var numbers = new double[] { 23, 46, 22, 74, 65 };
  52.         var wanted = 829;
  53.         // var numbers = new double[] {4,1,8,100,8,50};
  54.         // var wanted = 589;
  55.         numbers = numbers.OrderBy(a => a).ToArray();
  56.         var used = numbers.Select(a => false).ToArray();
  57.         var count = 0;
  58.         var set = new HashSet<string>();
  59.         foreach (var s in Formula(numbers, used, wanted))
  60.         {
  61.             count++;
  62.             if (set.Add(String.Join("\n", s.Split('\n').OrderBy(a => a).ToArray())))
  63.                 Console.WriteLine(s);
  64.         }
  65.         Console.WriteLine(count);
  66.         Console.WriteLine(set.Count);
  67.     }
  68. }
  69.  
Advertisement
Add Comment
Please, Sign In to add comment