Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

НОД и НОК в C++.Кто напишет выберу лучшим ответом.

Теймур Наджафов Ученик (218), закрыт 12 лет назад
Лучший ответ
Дмитрий Александрович Профи (740) 14 лет назад
НОД:
int gcd(int x, int y)
{
if (y == 0)
return x;
return gcd(y, x % y);
}

НОК:

Для того, что их читать из поля “n_gr ” напишем функцию.

string[] nums(string str, int f_m)
{
string[] numbers = new string[f_m + 1];
f_m = 0;
for (int i = 0; i < str.Length; i++)
{
if (str.Substring(i, 1) != " ")
numbers[f_m] += str.Substring(i, 1);
else
f_m++;
}

return numbers;
}

string[] nums(string str, int f_m)
{
string[] numbers = new string[f_m + 1];
f_m = 0;
for (int i = 0; i < str.Length; i++)
{
if (str.Substring(i, 1) != " ")
numbers[f_m] += str.Substring(i, 1);
else
f_m++;
}

return numbers;
}

Входные параметры “str” и “f_m” – это строка с числа и количество чисел соответственно. Создаем массив размерностью “f_m” и начинаем “выдирать” числа из строки и добавлять их в массив “numbers”. Функция возращает массив с числами из строки.

private void find_Click(object sender, EventArgs e)
{
string s = n_gr.Text;
int i = 0, f_m = 0;
while (i < s.Length)
{
if (s.Substring(i, 1) == " ")
f_m++;
i++;
}
string[] numbers = new string[f_m + 1];
numbers = nums(s, f_m);
int c = 2;
bool nok = true;
for (; ; )
{
for (i = 0; i < numbers.Length; i++)
if (numbers != "")
if (c % Convert.ToInt32(numbers) == 0)
{
if (i == 0 || nok == true)
nok = true;
}
else
nok = false;
if (nok == true)
{
n_nok2.Text = Convert.ToString(c);
break;
}
if (c >= 1000000)
{
n_nok2.Text = "НОК для данных чисел не найден! ";
break;
}
c++;
}
}
Остальные ответы
Голый Мужик Мыслитель (9629) 14 лет назад
Процитирую свой ответ http://otvet.mail.ru/question/30984425/ странслировав код на С++

Нод:

пусть r - остаток от деления a на b. Есть алгоритм Евклида, согласно которому НОД (a, b) = НОД (b, r). Алгоритм порождает итеративный процесс, на котором одна из редукций даст пару аргументов с нулём в качестве b, а результатом будет являться аргумент a. Запишем алгоритм в форме хвостовой рекурсии:

int Gcd(int a, int b)
{
if (b == 0)
return a;
else
{
int r = a % b;
return Gcd(b, r);
}
}

Перепишем алгоритм в императивном стиле:

int Gcd(int a, int b)
{
while (b != 0)
{
int r = a % b;
a = b;
b = r;
}

return a;
}

НОК находится по формуле:

lcm(a, b) = (a * b) / gcd(a, b)
gcd(a, b) - НОД, полученный выше.

int Lcm(int a, int b)
{
return (a * b) / Gcd(a, b);
}

Тупо.
Похожие вопросы