Вопрос № 177047: Уважаемые эксперты: вводятся 4 числа если произведение первых трех равно четвертому оставить без изменения, а иначе найти такое разложение четвертого числа на три множителя чтобы они были максимально близки друг к другу. Например: 4, 3, 2, 24 а не 12...
Вопрос № 177047:
Уважаемые эксперты: вводятся 4 числа если произведение первых трех равно четвертому оставить без изменения, а иначе найти такое разложение четвертого числа на три множителя чтобы они были максимально близки друг к другу. Например: 4, 3, 2, 24 а не 12, 2, 1, 24 или 2, 2, 2. 8 а не 1. 1. 8. 8 и чтобы располагались множители по убывающей.Требуется решить на Си без применения массивов. Перебором.Заранее благодарю.
Отправлен: 04.03.2010, 04:49
Вопрос задал: Анатолий11
Всего ответов: 1 Страница вопроса »
Отвечает Verena, Профессионал :
Здравствуйте, Анатолий11. Полагаю, что примерно так:
Код:
int main () { unsigned int a, b, c, d; scanf ("%i", &a); //ввод данных scanf ("%i", &b); scanf ("%i", &c); scanf ("%i", &d); if (d==a*b*c) { //если выполнено
начальное условие printf ("d = a*b*c"); //выводим сообщение и заканчиваем программу return 0; } int i, j, k; bool f = true; //флаг отсутствия множителей for (i = 1; i<=d/2; i++) { //первый множитель if (d%i!=0) continue; //если не множитель - пропускаем for (j=i; j<=d/2; j++) { //второй множитель, больший чем первый if (d%j!=0) continue; //если не множитель - пропускаем for (k=j; k<=d/2; k++) { //третий мн
ожитель, больший чем второй if (d%k!=0) continue; //если не множитель, пропускаем if (i*j*k==d) { //если получаем число if (f) //если множителей ещё не было {a = i; b = j; c = k; f = false;} //сохраняем текущие и выставляем флаг else //иначе проверяем, какие множители между собой ближе if (abs(a-b)>abs(i-j) || abs(b-c)>abs(j-k)) {a = i; b = j; c = k;} //если новые оказались ближе, сохраняем их } } } } if (f) printf ("\nResult:
%i*1*1=%i", d, d); //если множителей нет, то вариант 1*1*само_число else printf ("\nResult1: %i*%i*%i=%i", c, b, a, d); //иначе выводим полученный результат getch (); //ожидание реакции пользователя return 0; }
Если что-то не понятно или не так, пишите в минифорум. Для работы надо подключить библиотеки conio.h и stdlib.h. Удачи!
----- Эта история - не для истории, понимаешь?
Ответ отправил: Verena, Профессионал
Ответ отправлен: 09.03.2010, 00:01
Номер ответа: 259998
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 259998
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.