
Код программы и схема алгоритма
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication16
{
class Program
{
static void Main(string[] args)
{
/*
2. Даны два массива: x[1] ≤… ≤ x[k], y[1] ≤ … ≤ y[l] и число q. Найти сумму вида x[i] + y[j], наиболее близкую к
числу q (число действий порядка k + l, дополнительная память – фиксированное число переменных, массивы не изменять).
*/
Console.Write("Введите число q= ");
int q = Convert.ToInt32(Console.ReadLine());
Console.Write("Введите размерность массива x, k= ");
int k = Convert.ToInt32(Console.ReadLine());
int[] x = new int[k];
for (int i = 0; i < k; i++)
{
Console.Write("Введите x[" + i + "] элемент ");
x[i] = Convert.ToInt32(Console.ReadLine());
}
Console.Write("Введите размерность массива y, l= ");
int l = Convert.ToInt32(Console.ReadLine());
int[] y = new int[l];
for (int i = 0; i < l; i++)
{
Console.Write("Введите y[" + i + "] элемент ");
y[i] = Convert.ToInt32(Console.ReadLine());
}
int p = 0;
int[] z = new int[k * l + 1];
for (int i = 0; i < k; i++) // Записываем сумму элементов массива x и y в массив z
{
for (int j = 0; j < l; j++)
{
int n = x[i] + y[j];
z[p] = n;
Console.WriteLine("Вывод суммы:" + z[p]);
p++;
}
} Console.ReadLine();
int f = z.Length - 1;
z[f] = q; // Записываем число q в массив z
int nomer = 0;
Array.Sort(z);
Console.WriteLine("Сортированный массив z= ");
bool we = false;
for (int i = 0; i < z.Length; i++)
{
bool re = we;
if ((z[i] == q) && (re == false)) // Находим первое вхождение числа q в массиве z и запоминаем порядковый номер
{
nomer = i;
we = true;
Console.ForegroundColor = ConsoleColor.Green;
}
Console.Write(" " + z[i]);
Console.ResetColor();
}
Console.WriteLine();
Console.WriteLine("Порядковый номер = " + nomer);
Console.ReadLine();
for (int i = 0; i < z.Length; i++)
{
if (z[i] == q)
{
int a = i;
if (!(q == z[z.Length - 1]))
{
if (q == z[0])
{
Console.WriteLine("Число " + z[1] + " является самой близкой суммой к числу q= " + q);
}
else
{
int v = Math.Abs(z[a] - z[a - 1]); // Находим число стоящее перед q
int v1 = Math.Abs(z[a] - z[a + 1]); // Находим число стоящее после q
if (v < v1)
{
Console.WriteLine("Число " + z[a - 1] + " является самой близкой суммой к числу q= " + q);
}
if (v > v1)
{
Console.WriteLine("Число " + z[a + 1] + " является самой близкой суммой к числу q= " + q);
}
if (v == v1)
{
Console.WriteLine("Числа " + z[a - 1] + " и " + z[a + 1] + " является самой близкой суммой к числу q= " + q);
}
}
}
else
Console.WriteLine("Число " + z[z.Length - 2] + " является самой близкой суммой к числу q= " + q);
} Console.ReadKey();
}
}
}
}