Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задача: Вводим к-во эл. массива -> формируется массив

990
14 марта 2009 года
Stalcer
137 / / 15.08.2004
:) Поправка: пользователь вводит количество элементов, которые должны быть в двумерном массиве => программа формирует двумерный массив нужной размерности.
Пример: вводим число 33, формируется массив 3x11

Мой вариант решения ниже. Кто сделал бы иначе?

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int simpleNum(int num, int& cells)
{
    int counter = 2, tmp = 1;
    while(tmp!=0 && counter <= num >> 1)
    {
        if(counter!=num)
        {
            tmp = num%counter;
            if(!tmp)
            {
                cells = counter;
                return num/counter;
            }
        }
        counter++;
    }
    return num;
}

void main()
{
    srand(time(0));
    int num, cells=1, rows=1, **ar;
   
    cout<<"Num: "<<endl;
    cin>>num;  
    rows = simpleNum(num, cells);

    int rnd = rand()%2;
    if(rnd) swap(rows,cells);
   
    cout<<cells<<" "<<rows<<"\n\n";

    ar = new int* [rows];
    for(int i=0; i<rows; i++)
    {
        ar = new int [cells];      
        for(int j=0; j<cells; j++)
        {
            ar[j] = rand()%10;
            cout<<ar[j]<<" ";
        }
        cout<<endl;
    }
   
    for(int i=0; i<rows; i++) delete []ar;
    delete []ar;
}
1.9K
14 марта 2009 года
GreenRiver
451 / / 20.07.2008
Может быть Вы забыли написать условие? :)
А то в коде какие-то множители, простые числа - а в задании просто сформировать массив??
990
14 марта 2009 года
Stalcer
137 / / 15.08.2004
Цитата: GreenRiver
Может быть Вы забыли написать условие? :)
А то в коде какие-то множители, простые числа - а в задании просто сформировать массив??



:) Поправка: пользователь вводит количество элементов, которые должны быть в двумерном массиве => программа формирует двумерный массив нужной размерности. Пример: вводим число 33, формируется массив 3x11

842
15 марта 2009 года
sigmov
301 / / 16.09.2008
Код:
#include <iostream>
#using <mscorlib.dll>
using namespace std;
using namespace System;
void main()
{
    array<int,2>^ Arr;
    int size;
    cout<<"Put count of elements:  ";
    cin>>size;
    if(size<1) throw gcnew System::Exception("size cannot be < 1");
    if(size==1)
        Arr = gcnew array<int,2>(1,1);
    else
    {
        int col = size/2 + 1;
        while(size%(--col)!=0){}
        Arr = gcnew array<int,2>(size/col,col);
    }
    cout<<"Your have array["<<Arr->GetLength(0)<<"x"<<Arr->GetLength(1)<<"]"<<endl;
    return;
}
7
15 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
А ежели пользователь ввёл 8 и хочет массив 4x2,а получит 2x4(если верить программе:)),что тогда делать?Или эта программа обладает интуицией?;)
990
15 марта 2009 года
Stalcer
137 / / 15.08.2004
Цитата: @pixo $oft
А ежели пользователь ввёл 8 и хочет массив 4x2,а получит 2x4(если верить программе:)),что тогда делать?Или эта программа обладает интуицией?;)


не важно какая ориентация массива, главное что он сформирован и содержит нужное кол-во элементов

sigmov судя по логике, очень сильный вариант, но у меня не компилируется (VS 2008)
fatal error C1190: managed targeted code requires a '/clr' option

990
16 марта 2009 года
Stalcer
137 / / 15.08.2004
Цитата: @pixo $oft
А вот перевести не судьба!

Компилятор сообщает,что для компиляции управляемого кода ему надо указать ключ /clr,только и всего


Серьезно? А я думал что он сообщает что я не знаю английский.

87
16 марта 2009 года
Kogrom
2.7K / / 02.02.2008
не нравится мне следущее:
1. есть new, но нет delete;
2. сравнение с нулем. лучше писать так if(переменная) или if(!переменная).
3. непонятное сравнение counter<=999. Почему counter не сравнивается с переменной, которая зависит от num, например num >> 1 ?
4. Функция simpleNum в некоторых случаях ничего не запысывает в переменную cells. Вероятно, это неправильно, так как пользователь мог в нее занести какое-либо левое значение ранее.
990
17 марта 2009 года
Stalcer
137 / / 15.08.2004
Цитата: Kogrom
не нравится мне следущее:
1. есть new, но нет delete;
2. сравнение с нулем. лучше писать так if(переменная) или if(!переменная).
3. непонятное сравнение counter<=999. Почему counter не сравнивается с переменной, которая зависит от num, например num >> 1 ?
4. Функция simpleNum в некоторых случаях ничего не запысывает в переменную cells. Вероятно, это неправильно, так как пользователь мог в нее занести какое-либо левое значение ранее.



Спасибо, действительно дельные советы, учел.
По поводу 1 и 2 все понятно, обычно так и пишу, но этот код писал на скорую руку не обратил внимание... )
Не совсем прочел num >> 1, знаю что побитовый сдвиг вправо, но в данном примере не совсем понял семантику данного выражения :)
Как учесть пункт 4 ? )

1.9K
17 марта 2009 года
GreenRiver
451 / / 20.07.2008
По пункту 3 - Kogrom, наверное имел ввиду, что-то другое.
В нагрузку: в цикле while у вас сравнение tmp!=0, которое всегда выполняется, а как только перестает выполняться, то происходит выход из функции. Вывод: это условие лишнее.
Далее: зачем внутри цикла, проверять if(counter!=num)...
Вот исправленный вариант
Код:
int simpleNum(int num, int& cells)
{
    int counter = 2;
    while ([COLOR="Red"]counter < num[/COLOR]) // Пункт 3
    {
        if (num%counter == 0)
        {
            cells = counter;
            return num/counter;
        }
        counter++;
    }
    [COLOR="Red"]cells = 1;[/COLOR] // Пункт 4
    return num;
}


А вообще я бы по-другому объявлял функцию. Например, так:
void simpleNum(int Num, int& Row, int &Cell);
87
17 марта 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Stalcer

Не совсем прочел num >> 1, знаю что побитовый сдвиг вправо, но в данном примере не совсем понял семантику данного выражения :)


Поделить на 2. Если counter больше половины num, то дальнейшее выполнение цикла бессмысленно вроде бы. Для половины num лучше завести отдельную переменную, а не делить каждый раз.

можно записать num / 2. Вероятно компилятор поймет, как оптимизировать, а код будет читабельнее для начинающих программистов.

Цитата: Stalcer
Как учесть пункт 4 ? )


GreenRiver показал.

842
18 марта 2009 года
sigmov
301 / / 16.09.2008
Цитата: Stalcer
sigmov судя по логике, очень сильный вариант, но у меня не компилируется (VS 2008)
fatal error C1190: managed targeted code requires a '/clr' option



Project Properties -> Property Page -> Configuration Properties -> General:
Common Language Runtime Support изменить с No на Clr

341
18 марта 2009 года
Der Meister
874 / / 21.12.2007
Цитата: sigmov
Project Properties -> Property Page -> Configuration Properties -> General:
Common Language Runtime Support изменить с No на Clr

Только по сути - это тот же вариант от Stalcer, только гораздо менее эффективный.

Цитата: Kogrom
Поделить на 2. Если counter больше половины num, то дальнейшее выполнение цикла бессмысленно вроде бы.

Я бы даже больше сказал:

Код:
struct Size
{
    int Width, Height;
}

void simpleNum(Size & result, int num)
{
    if (num > 3)
    {
        for (int height = 2; ; height++)
        {
            int width = num / height;
            if (height > width)
                break;

            if (num % height == 0)
            {
                result.Width = width;
                result.Height = height;

                return;
            }
        }
    }
   
    result.Width = num;
    result.Height = 1;
}
Например, простоту одиннадцати определяем за две итерации, двадцати трёх - за четыре.
842
18 марта 2009 года
sigmov
301 / / 16.09.2008
Цитата: Der Meister
[QUOTE=sigmov]Сообщение от sigmov

Только по сути - это тот же вариант от Stalcer, только гораздо менее эффективный.[/QUOTE]

Эффективность - вещь относительная:
1) Иногда нужен код с максимальной скоростью.
2) Иногда нужен код, который занимает в скомпилированном виде мин. места.
3) Иногда нужен код, который лучше понятен.
4) Иногда нужен код, который занимает меньше строчек.
5) Иногда нужен код под конкретную среду исполнения.

И обычно человек расставляет себе приоритеты и на их основании делает выводы об эффективности.

Поэтому если сказали "а" - говорите "б"
например:
1) Код будет дольше выполняться
2) необходим framework

5
18 марта 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: sigmov
Эффективность - вещь относительная


И всегда нужен наиболее подходящий под задачу инструмент.

341
18 марта 2009 года
Der Meister
874 / / 21.12.2007
Цитата: sigmov
И обычно человек расставляет себе приоритеты и на их основании делает выводы об эффективности.

Поэтому если сказали "а" - говорите "б"
например:
1) Код будет дольше выполняться
2) необходим framework

Не-не-не... Не о том речь. 2х8 = 8х2. То есть, запуская цикл с конца, вы получаете тот же самый результат, но "кверх ногами" + бессмысленно проверять часть интервала, относящуюся к [n / height, n]. Могу дать тому теоретические выкладки.

1.9K
18 марта 2009 года
GreenRiver
451 / / 20.07.2008
А вот и легальный способ заработать кучу бабла ;) Подробности тут.
Сейчас вычислим оптимальный способ нахождения простых чисел, поделим интервал чисел на всех - деньги поровну :D
842
19 марта 2009 года
sigmov
301 / / 16.09.2008
Цитата: Der Meister
Не-не-не... Не о том речь. 2х8 = 8х2. То есть, запуская цикл с конца, вы получаете тот же самый результат, но "кверх ногами" + бессмысленно проверять часть интервала, относящуюся к [n / height, n]. Могу дать тому теоретические выкладки.



Полностью согласен.

990
20 марта 2009 года
Stalcer
137 / / 15.08.2004
Der Meister
Спасибо за еще один вариант. Учел неточности в алгоритме...
Вот только не совсем понял зачем структура..
341
20 марта 2009 года
Der Meister
874 / / 21.12.2007
Цитата: Stalcer
Der Meister
Спасибо за еще один вариант. Учел неточности в алгоритме...
Вот только не совсем понял зачем структура..


Возвращать результат в таком виде гораздо приятней, чем разрозненную совокупность "возвращаемое значение + параметр".
И это не другой вариант, это - тот же ваш вариант, но с дополнительным условием, позволяющим сократить количество итераций в случае простых чисел.
Уверен, можно придумать гораздо более эффективный алгоритм.

990
20 марта 2009 года
Stalcer
137 / / 15.08.2004
Der Meister
Я понял, имел ввиду вариант модификации :) Спасибо большое
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог