0 / 0 / 0 Регистрация: 18.12.2013 Сообщений: 2 |
|
1 |
|
В массиве чисел найти первое отрицательное число18.12.2013, 21:29. Показов 6971. Ответов 1
Думаю что он легкий, а решить не могу( не умею решать их) ( Заранее спасибо!
0 |
vasy02 12 / 12 / 8 Регистрация: 19.10.2010 Сообщений: 237 |
||||
19.12.2013, 06:35 |
2 |
|||
Решение
не вижу ничего сложного=)
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
19.12.2013, 06:35 |
Помогаю со студенческими работами здесь
В файле найти первое положительное и последнее отрицательное числа Найти в последовательности чисел 1, 1+, 1++,… первое число, большее заданного А Дано действительно число А. Найти среди чисел 1,1+1/2, 1+1/2+1/3,….. первое, большее А. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 2 |
Формулировка задачи:
Думаю что он легкий, а решить не могу( не умею решать их) (
В массиве чисел А1 А2……Аn найти первое отрицательное число и напечатать его номер
Заранее спасибо!
Код к задаче: «В массиве чисел найти первое отрицательное число»
textual
var a:array [1..100] of integer; i,x:integer; n:integer; begin readln(n); for i:=1 to n do read(a[i]); for i:=1 to n do if a[i]<0 then begin x:=i; break; end; writeln(x); readln; readln end.
Полезно ли:
6 голосов , оценка 4.000 из 5
надо
if (a[i]<0&&plus2==0) {plus=a[i];plus1=i;/*вот тут ошибка*/ plus2++;}
а вообще у вас алгоритм содержит одну принципиальную ошибку (правда возникающую с вероятностью 0.5^n)
если так получилось, что у вас вообще не содержится отрицательных или положительных чисел, то ваш алгоритм все равно выдает значение позиция:0, значение:0
вообще лучше, если число не определено использовать отрицательную позицию, тогда вам не потребуется вводить лишних переменных:
int plus_value = 0,
minus_value = 0,
plus_pos = -1,
minus_pos = -1;
for (i = 0; i < n; i++)
{
a[i] = rand() % 100 - 50;
printf("%dt", a[i]);
// рассматриваем все отрицательные значения и записываем позицию последнего
if (a[i] < 0) {
minus_value = a[i];
minus_pos = i;
}
// рассматриваем положительные значения только тогда, когда не было найдено ни одного положительного значения ранее (позиция остается неопределённой - -1)
if (a[i] > 0 && plus_pos == -1) {
plus_value = a[i];
plus_pos = i;
}
}
Кроме того вам требуется выявить первый положительный элемент, а значит как только вы нашли элемент проверку выполнять дальше не следует, поэтому
-
для отрицательного числа (которое надо найти последнее) проверяется каждый элемент
if (a[i] < 0) {
-
для положительного числа (которое надо найти первое) проверяется элемент до тех пор пока не будет найден первый положительный элемент
if (a[i] > 0 && plus_pos == -1) {
P.S.
Ну и соответственно когда вы выводите результаты — проверяйте minus_pos
и plus_pos
на -1
и выводите соответствующий текст — типа положительных чисел найдено не было
Запомните — чем меньше n, тем выше шанс, что это случится, а при n = 1 шанс равен 100%, что или отрицательных или положительных или и тех и других найдено не будет (например в массиве только 0 будет)
а за что автора вопроса минусуют?
torrero80 Пользователь Сообщений: 6 |
Привет, Коллеги ) Помогите, пожалуйста, решить такую НЕТРИВИАЛЬНУЮ, НО РЕАЛЬНУЮ задачу. |
vikttur Пользователь Сообщений: 47199 |
Комплексные задачи решают в разделе платных закзов. Или Вы считаете, что п.5 (5.1-5.5)- один вопрос? |
БМВ Модератор Сообщений: 21632 Excel 2013, 2016 |
vikttur, g.6 не выполним вааще По вопросам из тем форума, личку не читаю. |
torrero80 Пользователь Сообщений: 6 |
Достаточно будет Только 5.1. |
БМВ Модератор Сообщений: 21632 Excel 2013, 2016 |
=MATCH(1=1;INDEX(B3:B75<0;);0)+2 Изменено: БМВ — 24.07.2018 12:36:15 По вопросам из тем форума, личку не читаю. |
torrero80 Пользователь Сообщений: 6 |
Спасибо. Работает. Но… только для первого отрицательного числа. |
БМВ Модератор Сообщений: 21632 Excel 2013, 2016 |
вот этот ваш ХОП не соотвтевует теме Если вам надо определить дату, которая на 14 (ну или X дней) ранее ухода остатка в минус исходя из плана , то это не совсем первое отрицательное. Изменено: БМВ — 24.07.2018 13:02:34 По вопросам из тем форума, личку не читаю. |
torrero80 Пользователь Сообщений: 6 |
#8 24.07.2018 13:00:26
Хорошо. |
||
БМВ Модератор Сообщений: 21632 Excel 2013, 2016 |
Коррида прям. Вы сформулировали название темы не корректно, написали придуманный алгоритм , который возможно не верен, а надо было то что было помечено руками, как точка заказа, пометить но автоматом, так? Изменено: БМВ — 24.07.2018 13:17:26 По вопросам из тем форума, личку не читаю. |
torrero80 Пользователь Сообщений: 6 |
#10 24.07.2018 13:18:40 Кнопка цитирования не для ответа [МОДЕРАТОР] 1. Ну не создавать же отдельную тему для маленькой подзадачи. В начале была идея, с помощью которого можно решить эту задачу, но нужно было решить этот пунктик, а я не знал как. УСЛОВНОЕ ФОРМАТИРОВАНИЕ С ПОМОЩЬЮ ФОРМУЛ:
Файл найдете здесь. |
||
torrero80 Пользователь Сообщений: 6 |
БМВ
Спасибо. Ваш первый ответ взял на вооружение )) |
БМВ Модератор Сообщений: 21632 Excel 2013, 2016 |
torrero80, ну раз уж сами сделали, то примите совет Изменено: БМВ — 24.07.2018 13:42:01 По вопросам из тем форума, личку не читаю. |
Мартын Пользователь Сообщений: 282 |
Если то, что написано это всё, то вот формула Изменено: Мартын — 24.07.2018 14:35:40 |
Jack Famous Пользователь Сообщений: 11035 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#14 24.07.2018 15:24:00 OFF
Изменено: Jack Famous — 24.07.2018 15:24:17 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||||
«Лучшее» решение — использовать linq:
int[] numbers = new int[] { 13, 22, -5, 94, 66, -38, 41, -79, -1, 53 };
int[] firstminus = new int[1];
firstminus[0] = numbers.FirstOrDefault(n => n < 0);
Обновление — в ответ на комментарий Гилада Грина о производительности — отличный момент! Когда я запускаю следующее, я обнаруживаю, что цикл на моем боксе работает примерно на 1/2 секунды быстрее:
static void Main(string[] args)
{
var stopWatch = new Stopwatch();
Console.WriteLine("Linq method");
stopWatch.Start();
for (var i = 0; i < 10000000; i++)
{
LinqMethod();
}
stopWatch.Stop();
Console.WriteLine($"Elapsed time: {stopWatch.Elapsed}");
stopWatch.Reset();
Console.WriteLine("Loop method");
stopWatch.Start();
for (var i = 0; i < 10000000; i++)
{
LoopMethod();
}
stopWatch.Stop();
Console.WriteLine($"Elapsed time: {stopWatch.Elapsed}");
Console.ReadLine();
}
private static void LinqMethod()
{
int[] numbers = new int[] { 13, 22, -5, 94, 66, -38, 41, -79, -1, 53 };
int[] firstminus = new int[1];
firstminus[0] = numbers.FirstOrDefault(n => n < 0);
}
private static void LoopMethod()
{
int[] numbers = new int[] { 13, 22, -5, 94, 66, -38, 41, -79, -1, 53 };
int[] firstminus = new int[1];
for (int i = 0; i < 10; i++)
{
if (numbers[i] < 0)
{
firstminus[0] = numbers[i];
break;
}
}
}