Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289

Найти ошибки в коде

19.02.2019, 16:28. Показов 3243. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ЗАДАЧА:
По заданному числу K найти размеры самого красивого прямоугольника (H и W).

Для определения степени красоты учитываются 2 параметра:
1) Насколько выбранный прямоугольник будет близок к квадрату. Значение этого параметра равно модулю разности чисел H и W (т.е. |H-W|);
2) Сколько плиток останется невостребованными после украшения стены. Значение этого параметра равно разности чисел K и H×W (т.е. K-H×W, где K ≥ H×W ).
Степень красоты вычисляется как сумма значений двух описанных выше параметров. Например, имея 11 плиток, можно выбрать прямоугольник 3×3, степень красоты равна 0+2 = 2. Также можно выбрать прямоугольник 2×5, тогда степень красоты равна 3+1 = 4. Считается, что чем меньше степень красоты, тем красивее прямоугольник.

Т.е. в результате должны быть выведены натуральные числа H и W, которые определяют размеры самого красивого прямоугольника. Числа должны быть разделены пробелом. Если решений несколько, выведите любое из них.

Например:
1) K = 11 -> H и W = 3 и 3;
2) K = 20 -> H и W = 4 и 5.

КОД:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
using namespace std;
 
int main()
{
    int k = 0, h = 0, w = 0;
 
    ifstream fin;
    fin.open("INPUT.TXT");
    fin >> k; 
    fin.close();
    
    h = (int)sqrt(k);
    w = h + (k - h * h) / h;
 
    ofstream fout;
    fout.open("OUTPUT.TXT");
    fout << h << " " << w;
    fout.close();
 
    return 0;
}
ЧТО НУЖНО ИСПРАВИТЬ? ЗАРАНЕЕ СПАСИБО
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2019, 16:28
Ответы с готовыми решениями:

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Найти ошибки в коде и исправить эти ошибки
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; class A{ private: int* a; size_t size_; ...

Найти ошибки в коде и исправить эти ошибки - C++
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить откуда. A.h #pragma once ...

9
Заблокирован
19.02.2019, 17:18
может
C++
1
w=(int)((double)k/h);
Добавлено через 28 минут
перемудрил
C++
1
w=k/h;
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
19.02.2019, 20:43
wwmax, это неправильное решение. Вы не учитываете второе условие "красоты". Первое значение k = 40, при котором проявляется ошибка. Ваша программа даст ответ h = 6, w = 6, при этом значение "красоты" https://www.cyberforum.ru/cgi-bin/latex.cgi?\small |6 - 6| + 40 - 6 \cdot 6 = 4, правильным будет ответ h = 5, w = 8 при значении "красоты" https://www.cyberforum.ru/cgi-bin/latex.cgi?\small |5 - 8| + 40 - 5 \cdot 8 = 3.
1
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
20.02.2019, 16:44  [ТС]
Спасибо! А что мне тогда написать в программе?
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
21.02.2019, 14:43
Цитата Сообщение от wwmax Посмотреть сообщение
А что мне тогда написать в программе?
Напишите функцию вычисления оценки и попробуйте найти такие w и h, при которых она принимает наименьшее значение. Даже если не найдёте закономерность, ничего страшного: можно перебрать все возможные варианты. Их не очень много, до https://www.cyberforum.ru/cgi-bin/latex.cgi?\small \sqrt{k} будет достаточно.
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
04.03.2019, 22:55  [ТС]
Однажды великий художник Гигабайт подарил королю Байтландии одно из своих лучших полотен. Король, впечатленный произведением Гигабайта, в знак благодарности подарил ему K плиток из очень ценной разновидности мрамора размером 10×10 сантиметров каждая.

Художник решил украсить этими плитками одну из стен своего дома. Он задумал выложить из них прямоугольник высотой H плиток и шириной W плиток. Художник понимает, что число вариантов для выбора H и W достаточно велико. Из всех возможных вариантов он хочет выбрать самый красивый. Ваша задача – помочь ему с выбором!

Для определения степени красоты художник решил учитывать два параметра:
- Насколько выбранный прямоугольник будет близок к квадрату. Значение этого параметра равно модулю разности чисел H и W(т.е. |H-W|).
- Сколько плиток останется невостребованными после украшения стены. Значение этого параметра равно разности чисел K и H×W(т.е. K-H×W, где K ≥ H×W ).

Степень красоты вычисляется как сумма значений двух описанных выше параметров. Например, имея 11 плиток, можно выбрать прямоугольник 3×3, степень красоты равна 0+2 = 2. Также можно выбрать прямоугольник 2×5, тогда степень красоты равна 3+1 = 4. Считается, что чем меньше степень красоты, тем красивее прямоугольник.

Ваша задача – написать программу, которая по заданному числу K находит размеры самого красивого прямоугольника.

Входные данные:
Единственная строка входного файла INPUT.TXT содержит одно целое число K – количество подаренных королем плиток (1 ≤ K ≤ 106).

Выходные данные:
Единственная строка выходного файла OUTPUT.TXT должна содержать натуральные числа H и W соответственно, которые определяют размеры самого красивого прямоугольника. Числа должны быть разделены одиночным пробелом. Если решений несколько, выведите любое из них.

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <fstream>
using namespace std;
 
int beautiful(int k, int h, int w) // функция, выполняющая оценку красоты
{
    return (abs(h - w) + (k-h*w));
}
 
int main()
{
    int k, hh, ww, best; // hh и ww - временные (промежуточные) переменные
 
    ifstream fin;
    fin.open("INPUT.TXT");
    fin >> k; //считываем количество подаренных плиток
    fin.close();
    
    int h = 1, w = k; // инициализируем h и w начальными значениями
    best = beautiful(k, h, w); // присваиваем best начальную "красоту"
    
    // перебираем все возможные стороны прямоугольника:
    for (unsigned j = k; j > 0; j--) { 
        
        for (unsigned i = 1; i*i <= j; i++) {
            if (j%i == 0) 
            {
                hh = i;
                ww = j / i;
                
                // выполняем оценку "красоты":
                if (beautiful(k, hh, ww) < best) // если текущая "красота" < лучшей "красоты"
                {
                    best = beautiful(k, hh, ww); // присваиваем лучшие значения
                    h = hh;
                    w = ww;
                }
            }
 
        }
    }
    
    ofstream fout;
    fout.open("OUTPUT.TXT");
    fout << h << " " << w; // выводим в файл h и w
    fout.close();
 
    return 0;
}
Как его можно ускорить?
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
04.03.2019, 22:58
Первое, что бросилось в глаза... Сделать функцию beautiful - inline. Она вызывается в 2-х циклах. Это существенно.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
04.03.2019, 23:24
А если через квадратный корень? Остаток плиток имеет больший вклад в красоту, чем разница сторон. Потом этот остаток добрасывать на одну из сторон, трансформировать прямоугольник, пока это возможно и пока остаток не станет меньше чем разница сторон. Для больших К такой подход по шустрее будет, вариантов поменьше все таки перебирать.(Математики, не ругайте меня)
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
04.03.2019, 23:51
C++
22
for (unsigned j = k; j > 0; j--) {
Вот объясните пожалуйста, зачем этот цикл? Разве не очевидно, что чем меньше использовать плиток, тем больше их останется и тем хуже получится оценка?

Добавлено через 6 минут
Цитата Сообщение от jugu Посмотреть сообщение
Сделать функцию beautiful - inline. Она вызывается в 2-х циклах. Это существенно.
Из пушки по воробьям. Для вычисления одного и того же значения функция вызывается дважды - проще вызвать один раз и сохранить результат. А если начать с алгоритма и перейти от https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n \cdot sqrt{n}) к https://www.cyberforum.ru/cgi-bin/latex.cgi?O(sqrt{n}), функция вообще перестанет играть существенную роль даже с повторным вызовом.
1
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
05.03.2019, 17:37
Цитата Сообщение от valen10 Посмотреть сообщение
Для вычисления одного и того же значения функция вызывается дважды - проще вызвать один раз и сохранить результат.
Если так, то да, проще сохранить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2019, 17:37
Помогаю со студенческими работами здесь

Найти ошибки в коде
Помогите найти ошибки в коде :c class A { public: void f1() { ++a; } void f2() { ++b; }

найти ошибки в коде
# include &lt;stdio.h&gt; # include &lt;conio.h&gt; int menu(int kp, char*NAZ); void main(void); int zadacha3 (int n, float *a, float...

Найти ошибки в коде
Вопрос 1: Найдите ошибки в коде: int main(int argc, char** argv) { int array = new int(30); for (size_t i = 0; i &lt; 30;...

Найти ошибки в коде
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...

найти ошибки в коде
Я чайник, но хочу разобраться. Объясните на пальцах. У меня есть код #include &quot;lexicalanalyzer.h&quot; #include &lt;sstream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru