Задача: Вводим к-во эл. массива -> формируется массив
Пример: вводим число 33, формируется массив 3x11
Мой вариант решения ниже. Кто сделал бы иначе?
#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;
}
А то в коде какие-то множители, простые числа - а в задании просто сформировать массив??
А то в коде какие-то множители, простые числа - а в задании просто сформировать массив??
:) Поправка: пользователь вводит количество элементов, которые должны быть в двумерном массиве => программа формирует двумерный массив нужной размерности. Пример: вводим число 33, формируется массив 3x11
#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;
}
не важно какая ориентация массива, главное что он сформирован и содержит нужное кол-во элементов
sigmov судя по логике, очень сильный вариант, но у меня не компилируется (VS 2008)
fatal error C1190: managed targeted code requires a '/clr' option
…
Компилятор сообщает,что для компиляции управляемого кода ему надо указать ключ /clr,только и всего
Серьезно? А я думал что он сообщает что я не знаю английский.
1. есть new, но нет delete;
2. сравнение с нулем. лучше писать так if(переменная) или if(!переменная).
3. непонятное сравнение counter<=999. Почему counter не сравнивается с переменной, которая зависит от num, например num >> 1 ?
4. Функция simpleNum в некоторых случаях ничего не запысывает в переменную cells. Вероятно, это неправильно, так как пользователь мог в нее занести какое-либо левое значение ранее.
1. есть new, но нет delete;
2. сравнение с нулем. лучше писать так if(переменная) или if(!переменная).
3. непонятное сравнение counter<=999. Почему counter не сравнивается с переменной, которая зависит от num, например num >> 1 ?
4. Функция simpleNum в некоторых случаях ничего не запысывает в переменную cells. Вероятно, это неправильно, так как пользователь мог в нее занести какое-либо левое значение ранее.
Спасибо, действительно дельные советы, учел.
По поводу 1 и 2 все понятно, обычно так и пишу, но этот код писал на скорую руку не обратил внимание... )
Не совсем прочел num >> 1, знаю что побитовый сдвиг вправо, но в данном примере не совсем понял семантику данного выражения :)
Как учесть пункт 4 ? )
В нагрузку: в цикле while у вас сравнение tmp!=0, которое всегда выполняется, а как только перестает выполняться, то происходит выход из функции. Вывод: это условие лишнее.
Далее: зачем внутри цикла, проверять if(counter!=num)...
Вот исправленный вариант
{
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);
Не совсем прочел num >> 1, знаю что побитовый сдвиг вправо, но в данном примере не совсем понял семантику данного выражения :)
Поделить на 2. Если counter больше половины num, то дальнейшее выполнение цикла бессмысленно вроде бы. Для половины num лучше завести отдельную переменную, а не делить каждый раз.
можно записать num / 2. Вероятно компилятор поймет, как оптимизировать, а код будет читабельнее для начинающих программистов.
GreenRiver показал.
fatal error C1190: managed targeted code requires a '/clr' option
Project Properties -> Property Page -> Configuration Properties -> General:
Common Language Runtime Support изменить с No на Clr
Common Language Runtime Support изменить с No на Clr
Только по сути - это тот же вариант от Stalcer, только гораздо менее эффективный.
Я бы даже больше сказал:
{
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;
}
Только по сути - это тот же вариант от Stalcer, только гораздо менее эффективный.[/QUOTE]
Эффективность - вещь относительная:
1) Иногда нужен код с максимальной скоростью.
2) Иногда нужен код, который занимает в скомпилированном виде мин. места.
3) Иногда нужен код, который лучше понятен.
4) Иногда нужен код, который занимает меньше строчек.
5) Иногда нужен код под конкретную среду исполнения.
И обычно человек расставляет себе приоритеты и на их основании делает выводы об эффективности.
Поэтому если сказали "а" - говорите "б"
например:
1) Код будет дольше выполняться
2) необходим framework
И всегда нужен наиболее подходящий под задачу инструмент.
Поэтому если сказали "а" - говорите "б"
например:
1) Код будет дольше выполняться
2) необходим framework
Не-не-не... Не о том речь. 2х8 = 8х2. То есть, запуская цикл с конца, вы получаете тот же самый результат, но "кверх ногами" + бессмысленно проверять часть интервала, относящуюся к [n / height, n]. Могу дать тому теоретические выкладки.
Сейчас вычислим оптимальный способ нахождения простых чисел, поделим интервал чисел на всех - деньги поровну :D
Полностью согласен.
Спасибо за еще один вариант. Учел неточности в алгоритме...
Вот только не совсем понял зачем структура..
Спасибо за еще один вариант. Учел неточности в алгоритме...
Вот только не совсем понял зачем структура..
Возвращать результат в таком виде гораздо приятней, чем разрозненную совокупность "возвращаемое значение + параметр".
И это не другой вариант, это - тот же ваш вариант, но с дополнительным условием, позволяющим сократить количество итераций в случае простых чисел.
Уверен, можно придумать гораздо более эффективный алгоритм.
Я понял, имел ввиду вариант модификации :) Спасибо большое