>> totalTax = 500.00 >> f = .05 >> p = .095 >> >> base = round(totalTax / (f*p + f + p), 2) >> >> >> for i = base - .50 to base + 0.50 step .01 >> fedTax = round(i * f, 2) >> provTax = round((i + fedTax) * p, 2) >> >> if ( fedTax + provTax == totalTax ) >> >> ? 'Base ' , i >> ? 'fedtax', fedTax >> ? 'provTax ', provTax >> exit >> endif >> >> if( fedTax + provTax > totalTax ) >> provTax = totalTax - fedtax >> ? 'Base ' , i >> ? 'fedtax', fedTax >> ? 'provTax ', provTax >> >> exit >> endif >> >> endfor >>>
static void Main(string[] args) { double totalTax, fedTax, provTax; totalTax = 500.00; if (TrySolveTaxes(totalTax, out fedTax, out provTax)) Console.WriteLine("TotalTax= {0} fedTax= {1} provTax= {2}", totalTax, fedTax, provTax); else Console.WriteLine("cannot solve"); Console.ReadLine(); } public static bool TrySolveTaxes(double totalTax, out double fedTax, out double provTax) { bool success = false; double fedPortion = .05; double provPortion = .095; // first shot double amount = Math.Round(totalTax / (fedPortion * provPortion + fedPortion + provPortion), 2); fedTax = Math.Round(amount * fedPortion, 2) ; provTax = Math.Round((amount + fedTax) * provPortion, 2) ; int deltaSign = Math.Sign(totalTax - (fedTax + provTax)); if (deltaSign == 0) success = true; else { double direction = .01 * deltaSign; int oldDeltaSign = deltaSign; do { amount += direction; fedTax = Math.Round(amount * fedPortion, 2); provTax = Math.Round((amount + fedTax) * provPortion, 2); deltaSign = Math.Sign(totalTax - (fedTax + provTax)); provTax = totalTax - fedTax; } while (deltaSign == oldDeltaSign); success = true; } return success; }