Advanced member
Статус: Не в сети Регистрация: 23.10.2003 Откуда: Иркутск/Майкоп
dude_wolv писал(а):
Случай с 4 кругами не уникален,также можно разрезать треугольник на 9, 16,25, 36 и т.д...
Да, но при разрезании на 9, 16, ... такой способ уже не будет наилучшим. Например, если a=6*sqrt(3), r=1, то по формуле k=6, N=15, а треугольников всего 9.
dude_wolv писал(а):
И можешь обьяснить формулу N=k*(k+1)/2, где k=(целая часть) (a/(2*r)-корень_из_3+1) а то я что-то не догоняю
Здесь круги размещаются так же, только без промежутков. Я нарисовал картинку и нашел соотношение между стороной и радиусом, при котором внутри треугольника помещается k-е по счету "треугольное число" кругов. Это делается в рамках школьной программы.
[добавлено]
Увы! Случай с 4 кругами обобщается, но по-другому. Если "треугольное число" кругов размещено внутри треугольника начиная с какого-нибудь угла, то у противоположной стороны остается зазор. Ширина свободной полоски может превышать радиус круга. Передвинем круги последнего ряда (который граничит с полоской) так, чтобы их центры были расположены не на одной прямой, а в вершинах зигзагообразной ломаной. Первый круг касается стороны, второй касается первого круга и одного из кругов 2-го ряда, третий касается второго и стороны и т.д. В результате освобождается место еще для нескольких кругов.
Тогда становится понятно, при чем здесь программирование.
Но нет никакой гарантии, что это решение наилучшее. Может быть, передвигая круги 2-го ряда мы еще чего-нибудь добьемся.
При небольшом числе кругов возможно переборное решение через рекурсию. Рассматриваются только те положения следующего круга, когда он касается двух линий.
_________________ Края каждого совершенно нового крышка процессора не на 100% гладкая. Это связано с тем, что следов мастерства не избежать. (c) Али.
Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
RV280 Не совсем понял вопрос. Если нужны управляющие символы, то getchar() в любом случае определена как int и может вернуть отрицательные значения. Например, EOF.
Если же речь идет о считывании вбитого юзером на клаве числа, то имеет смысл считать его в промежуточный буфер, а потом воспользоваться atoi(). А еще потом - посмотреть на группу scanf/sscanf. Добавлено спустя 4 минуты, 48 секунд xr0m навскидку:
Код:
int i, j; for( i = 0; i < 4; i++ ) for( j = 0; j < 4; j++ ) { // полезный код вокруг array[ i ][ j ] }
более оптимизированный код:
Код:
int i; int max1 = 0, max2 = 0; for( i = 0; i < 4; i++ ) { max1 += array[ i ][ i ]; max2 += array[ i ][ 3 - i ]; // потому что начали отсчет от нуля } printf( "%d", max( max1, max2 ) )
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: Израиль
Herod эх.. спасибо )
ТОлько оно так будет работать только по диагоналям от угла до угла ) а есть еще ж "маленькие" диагонали, в них сумма может быть больше. В этом то и загвозка, выходит что это будет цикл и в цикле еще цикла.. 4. надо еще подумать.
_________________ человек на 80% состоит из жидкости, многие из тормозной...
Member
Статус: Не в сети Регистрация: 26.05.2005 Откуда: Atlanta, GA
Herod спасибо, проблему решил с помощью scanf()
имелась в виду простая программа, считывающая из stdin некоторое число(допустим, 55), и потом печатающая то же число(55) определенных знаков
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: Израиль
Сделал, функция складывающая диагонали. если кому надо
Код:
int MaxDiagonals (int arr[N][N]) { int i,j,n,sum1=0,sum2=0,sum3=0,sum4=0; for (i=0;i<N;i++) { for (j=0,n=i;j<i, n>=0;j++, n--) sum2+=arr[n][j]; if (sum2>sum1) sum1=sum2; sum2=0; } for (i=0;i<(N-1);i++) { for (j=(i+1),n=(N-1);j<=i, n>i;j++, n--) sum3+=arr[n][j]; if (sum3>sum4) sum4=sum3; sum3=0; } if (sum4>=sum1) return sum4; else return sum1; }
где N - размер маcсива
_________________ человек на 80% состоит из жидкости, многие из тормозной...
Это рисует на экране треугольник, размер которого можно изменять при запуске программы (пускаю из консоли в линухе - "./имя_программы 45", где 45 - это размер), если размер при запуске не вводить - он будет по-дефолту (32). Нужно написать че-нить вроде того, только чтоб рисовался круг (окружность)...
Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
Russian, навскидку:
Код:
int radius, x, y; ... // заполнили радиус for( y = 0; y < radius * 2; y++ ) { for( x = 0; x < radius * 2; x++ ) { int rx = x - radius, ry = y - radius; // приведем это дело в вид, где центр круга - начало координат if( ( rx * rx + ry * ry ) == radius * radius ) printf( "*" ); else printf( " " ); } }
Russian Дык я эту идею и реализовал.
Но оказывается, что это было чье-то домашнее задание, и этот кто-то, просачковав все уроки, вряд-ли знает даже какого цвета учебник.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения