Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 50 из 87<  1 ... 47  48  49  50  51  52  53 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: Израиль
вопрос к вам есть по программированию в плане логики

дана матрица
скажем
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

и мне нужно посчитать сумму диагоналей и вывести максимум

не могу придумать, как сделать пробежку по матрице по диагоналям

язык Си

_________________
человек на 80% состоит из жидкости, многие из тормозной...


 

Member
Статус: Не в сети
Регистрация: 26.05.2005
Откуда: Atlanta, GA
всем доброго времени суток!
изучаю книгу Кернигана и Ритчи, возник вопрос
данные, которые функция getchar() считывает из stdin, надо перевести в int

ps я бы погуглил, да жаль хреновый интернет дико лагает, поэтому вся надежда на форум
pps да, классический K&R C

_________________
Whatever that hurts


 

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
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Может быть глупый вопрос, но как на Си нарисовать круг в псевдографике, типа # $ * и пр.?


 

Member
Статус: Не в сети
Регистрация: 26.05.2005
Откуда: Atlanta, GA
Herod
спасибо, проблему решил с помощью scanf()
имелась в виду простая программа, считывающая из stdin некоторое число(допустим, 55), и потом печатающая то же число(55) определенных знаков

_________________
Whatever that hurts


 

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% состоит из жидкости, многие из тормозной...


 

Member
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Provider писал(а):
Может быть глупый вопрос, но как на Си нарисовать круг в псевдографике, типа # $ * и пр.?

Помогите кто-нить плиз :weep:


 

Member
Статус: Не в сети
Регистрация: 01.05.2007
Откуда: Тель-Авив
Фото: 1
Provider писал(а):
Помогите кто-нить плиз Рев в 3 ручья

Нарисовать круг в текстовом редакторе, а потом построчно засунуть в серию puts(). Сойдет?
Если не очень, то надо уточнить задание.


 

Member
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Herod писал(а):
Нарисовать круг в текстовом редакторе, а потом построчно засунуть в серию puts(). Сойдет?

Нее, это слишком просто...
Есть вот че:
Код:
#include <stdio.h>

int main(int argc, char *argv[])
{
    int i, f, line1, line2, line3;
    line1 = 32;

    if(argc>1)
        line1 = atoi(argv[1]);

    line3 = (line1-1)/2;
    line2 = (line1-1)/4;

    for(f=0; f<line2; f++)
    {
        for(i=0; i<line3-1; i++)
            printf(" ");
        printf("##");
        for(i=line3; i<(line1-line3-2); i++)
            printf(" ");
        if(line3<(line1-line3-1))
            printf("##");
        else
            printf("#");
        printf("\n");
        line3-=2;
    }

    for(i=0; i<line1; i++)
        printf("#");
    printf("\n");
}

Это рисует на экране треугольник, размер которого можно изменять при запуске программы (пускаю из консоли в линухе - "./имя_программы 45", где 45 - это размер), если размер при запуске не вводить - он будет по-дефолту (32). Нужно написать че-нить вроде того, только чтоб рисовался круг (окружность)...


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
Provider ( x-x0)^2 + (y-y0)^2 = r^2 вот формула круга,выбираешь радиус(r),выбираешь начальные координаты(х0,у0)
вот и рисуешь ## там где равенство

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Формулу я эту знаю, но как ее применить в моем случае понятия не имею... в этом проблема :weep:


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
Provider ну текстовый режим в эмуляторе доса вроде бы 80Х50
есть команда gotoxy(x,y) которая позваляет попасть в любую точку экрана

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Russian Нее, я не про это... Я имел ввиду, что я не знаю как использовать эту формулу в программе, что и отткуда брать и пр.


 

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( " " );
    }
}

Вот. Примерно так.


 

Member
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Herod Ниче не понял :insane: А откуда мне брать значения radius, x, y? :roll:


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
Herod а я про что?

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 01.05.2007
Откуда: Тель-Авив
Фото: 1
Provider
x и y ниоткуда брать не надо. Они обнуляются.
Насчет радиуса: в учебнике явно написано нечто вроде
Код:
int main( int argc, char *argv[], char *env[] )
{
    int radius, x, y;

    if( argc == 1 )    // вписать вместо многоточия
        sscanf( argv[ 1 ], "%d", &radius );
    else {
        printf( "Правила использования. Передайте радиус в командной строке!" );
        return 1;
    }

   for( y = 0; .... // далее по тексту выше


Russian
Дык я эту идею и реализовал.
Но оказывается, что это было чье-то домашнее задание, и этот кто-то, просачковав все уроки, вряд-ли знает даже какого цвета учебник.


 

Member
Статус: Не в сети
Регистрация: 19.12.2005
Откуда: НН
Фото: 69
Herod писал(а):
Но оказывается, что это было чье-то домашнее задание, и этот кто-то, просачковав все уроки, вряд-ли знает даже какого цвета учебник.

Если ты это про меня, то напрасно... я Си учу на работе в свободное время. А че за учебник, если не секрет?


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 50 из 87<  1 ... 47  48  49  50  51  52  53 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan