Форум программистов, компьютерный форум CyberForum.ru

Найти сумму первых элементов массива, произведение которых не превышает заданного числа М - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
Zalik
2 / 2 / 0
Регистрация: 24.05.2010
Сообщений: 94
15.03.2012, 17:40     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #1
Имеется последовательность чисел a1, a2, ... ,aN, образована по правилу аi=random(N). Найти сумму первых из них (считая слева направо), произведение которых не превышает заданного числа М.
Очень прошу помочь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 17:40     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М
Посмотрите здесь:

C++ Найти максимальную сумму чисел, произведение которых не превышает заданного числа.
C++ Найти сумму тех элементов массива, цифровая запись которых дает четную сумму цифр, а также найти максимальный элемент массива
Вычислить и вывести произведение первых 7 элементов массива и сумму следующих 7 элементов находящихся на четных позициях C++
C++ В матрице А (mxn) найти найти сумму элементов по колонкам, значения которых по модулю меньше заданного числа К
В заданном массиве из n элементов найти сумму первых n/2, а затем произведение оставшихся элементов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 11:00     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #21
Цитата Сообщение от dimcoder Посмотреть сообщение
говорю же, зависит от компилятора.
Цитата Сообщение от dimcoder Посмотреть сообщение
При моем тесте
- поставь другой компилятор, например перейди с DevC на студию и забудь о ряде ненужных проблем...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
16.03.2012, 11:06     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
поставь другой компилятор, например перейди с DevC на студию и забудь о ряде ненужных проблем
По моему вы уходите от темы. Признайте, здесь вы были не правы:
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if -а достаточно чтобы алгоритм не обломился
-=ЮрА=-
16.03.2012, 11:15
  #23

Не по теме:

Цитата Сообщение от dimcoder Посмотреть сообщение
Признайте, здесь вы были не правы:
- пишу в студии, пишу для ОС Windows выложил скриншот работы могу и экзешник выложить по коду. Т.е. если ты пишешь в С3.1 или борланд Си или ещё в невесть чём это не мои проблеммы.
dimcoder, по моему от темы ушёл ты - тема Zalik, а если хочется покусаться со мной, то можно в личке.
PS:Я не признаю ни DevC ни ещё ряд IDE что дальше???У тебя платформа какая - предположу Windows - вот будь добр пиши в среде от разработчиков твоей платформы, а не во всяком ужасе которого сейчас расплодилось...

dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
16.03.2012, 11:32     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я не признаю ни DevC ни ещё ряд IDE что дальше?
Надеюсь стандарт вы признаете.

An allocation function that fails to allocate storage can invoke the currently installed new-handler function (18.6.2.3), if any. [Note: A program-supplied allocation function can obtain the address of the currently installed new_handler using the std::sget_new_handler function (18.6.2.4). —end note ] If an allocation function declared with a non-throwing exception-specification (15.4) fails to allocate storage, it shall return a null pointer. Any other allocation function that fails to allocate storage shall indicate failure only by throwing an exception of a type that would match a handler (15.3) of type std::bad_alloc (18.6.2.1).

Здесь черным по белому написано: если размещающая функция не способна предоставить память, ей следует либо вызвать функцию установленную программистом, либо возвратить null pointer, либо выбросить исключение.

Поэтому предположение
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if -а достаточно чтобы алгоритм не обломился
неверно.
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 13:24     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #25
Цитата Сообщение от dimcoder Посмотреть сообщение
non-throwing exception-specification (15.4) fails to allocate storage, it shall return a null pointer.
Цитата Сообщение от dimcoder Посмотреть сообщение
либо возвратить null pointer,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(arr = new int[n]))
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
arr = NULL;
,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если выбросит исключение bad alloc приравняй arr = NULL и иди дальше
Может красное заметней будет...
А теперь от себя - ты ровным счётом ничего в топике не сделал для ТС (НОЛЬ полный, даже не удосужился ошибку ему показать, зато настрочил здесь уже 1,5 листа метафор). Ты привёл стандарт я привёл код, рабочий, что дальше?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
16.03.2012, 13:58     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #26
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если выбросит исключение bad alloc приравняй arr = NULL
Вот в том то и дело, что если выбросится исключение, то придется с ним что-то делать, а у вас в #19 посте этого не предусмотрено (и программа как сказано в стандарте может выбросить исключение -> terminate).
Цитата Сообщение от dimcoder Посмотреть сообщение
возвратить null pointer
Ваш код будет работать только в этом случае.

Я бы понял такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
int main()
{
        int * arr       = 0;
        unsigned long n = 0;
        while(true)
        {
                cin.clear();
                cin.sync();
                cout<<"Enter num of elements in array\n";
                try
                {
                if(!(cin>>n))
                        cout<<"Input error\n";
                else
                if(!(arr = new int[n]))
                        cout<<"Alllocation memory error\n";
                else
                {
                        cout<<"Allocation successfull\n"
                                <<"number of elements : "<<n<<endl
                                <<"adress of array 0x"<<arr<<endl;
                        delete [] arr;
                }
                }
                catch (bad_alloc& e)
                {
                    cout << "Exception has been thrown: " << e.what() << endl;
                }
                arr = NULL;
        }
        return 0;
}
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 14:37     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #27
Цитата Сообщение от dimcoder Посмотреть сообщение
Я бы понял такой код:
- ну и где тЫ в нём устранил свой bad_alloc???Зашёл в трай кэтч пропечатал ексепшн, ну и где ты удалил это самое ексепшн, м?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
16.03.2012, 15:35     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
удалил это самое ексепшн
А зачем его удалять (честно говоря я понятия не имею как "удалять" эксепшн)? Главное предотвратить экстренное завершение программы и дать понять где произошла ошибка. Пропечатал бы я даже там "Allocation memory error", разница была бы небольшая - я делаю то же самое что и вы при возвращении new NULL poiner'a. Главное что программа не завершилась и не было бы stack unwinding'a.
Zalik
2 / 2 / 0
Регистрация: 24.05.2010
Сообщений: 94
16.03.2012, 15:38  [ТС]     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #29
Огромное спасибо всем кто помогал! Вот что в итоге получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include <iostream>
#include<CONIO.H>
#include<STDIO.H>
#include <time.h>
#include <stdlib.h>
using namespace std;
 
int main()
{
    int n;
srand(time(NULL));
float *massiv;
cout<<"Vvedite chislo elementov : ";
cin>>n;
 massiv = new float [n];
for (int i=0; i<n; i++)
{
massiv[i] = float (rand()%10);
cout << massiv[i] << " " ;}
    int a;
    cout << endl << "Vvedite chislo" << endl;
    cin >> a;
    int umnog = 1, summa = 0;
    if(massiv[0] < a){
        for(int i = 0; i < 10; i++){
            if(umnog < a){
                umnog *= massiv[i];
                summa += massiv[i];
            }
            else{
                summa = summa - massiv[i - 1];
                break;
            }
        }
    }
    else{
        cout << "Oshibka :-(((";
    }
    cout <<"Summa ravna="<< summa;
 
    getch();
}
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 17:11     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #30
Zalik, т.к. мне в отличие от dimcoder, непо.. как ты будешь сдавать свой код то запиши его так(это твой же код только без 3-х ошибок, которые есть в твоём алгоритме)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    int M, N, i;
    int *massiv = NULL;
    cout<<"Vvedite chislo elementov : ";cin>>N;
    srand(time(NULL));
    massiv = new int [N];
    for (i = 0; i < N; i++)
    {
        massiv[i] = (rand()%N);
        cout << massiv[i] << " " ;
    }
    cout<<endl<<"Vvedite chislo M : ";
    cin>>M;
    int umnog = 1; 
    int summa = 0;
    for(i = 0; i < N; i++)
    {
        umnog *= massiv[i];
        summa += massiv[i];
        if(M < umnog)
            break;
    }
    if(i == 0)
        cout << "Oshibka pervi element men'she M:-((("<<endl;
    else
        cout <<"Summa ravna="<< summa<<endl;
    system("pause");//Âìåñòî getch
    return 0;
}
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 17:40     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #31
PS Zalik, переставь строку в этом цикле
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 0; i < N; i++)
* * * * {
* * * * * * * * umnog *= massiv[i];
* * * * * * * * if(M < umnog)
* * * * * * * * * * * * break;
summa += massiv[i];
* * * * }
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
16.03.2012, 17:50     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #32
-=ЮрА=-, если я поправил вас в утверждении
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if -а достаточно чтобы алгоритм не обломился
и вы упорно отказываетесь в это верить, это не значит что мне
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
по..
Также я не понимаю, почему вы до сих пор упорно продолжаете игнорировать мои предыдущие сообщения и аргументы, ваши опровержения которых являются по сути несущественными.
-=ЮрА=-
16.03.2012, 17:55
  #33

Не по теме:

dimcoder, достал, поправь лучше алгоритм ТС, если ты конечно в нём видишь ошибки...

Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.03.2012, 17:55     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #34
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
2
3
time_t t;
// ...
srand(time(&t));
Зачем в time передавать адрес переменной, которая не будет использоваться в дальнейшем?
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 20:37     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #35
Цитата Сообщение от Nameless One Посмотреть сообщение
Зачем в time передавать адрес переменной, которая не будет использоваться в дальнейшем?
- обычно я пишу на многократную генерацию

C
1
2
3
4
5
6
7
time_t t;
while(1)
{
      srand(time(&t));
      //....
      rand();
}
- и этим стараюсь оградить свой код от псевдослучайных последовательностей, хотя для данного алгоритма в принципе можно и srand(time(NULL)); Всё же думаю лучше пусть пользователь сразу привыкнет использовать такую конструкцию, чтобы не ломать голову, а почему эе в коде ниже последовательности повторяются
C
1
2
3
4
5
6
while(1)
{
      srand(time(NULL));
      //....
      rand();
}
Добавлено через 17 минут
Nameless One, можешь как эксперт сказать в большинстве IDE при создании exe уже заложен внутренний фильтр badalloc или нет, т.к. в определённом месте топик уже вышел за рамки конструктивной беседы...
Итак, приложения слинкованные в Release без try catch с компиляором GNU выдали програмное прерывание, с компилятором VisualStudio и BorlandC 6 прошли "предполагаемое место краха" без проблем, где же правда?Мне интересно услышать конкреное мнение, т.к. спор спором но граблей c badalloc в IDE c которыми работаю я не встречал: при невозможности выделения памяти даже в catch(badalloc) алгоритм не заходит, вот сижу и думу думаю...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.03.2012, 10:23     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- и этим стараюсь оградить свой код от псевдослучайных последовательностей
вот это не понял

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Nameless One, можешь как эксперт сказать в большинстве IDE при создании exe уже заложен внутренний фильтр badalloc или нет
какой такой «внутренний фильтр»?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Итак, приложения слинкованные в Release без try catch с компиляором GNU выдали програмное прерывание
т.е. исключение, я правильно понял?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
с компилятором VisualStudio и BorlandC 6 прошли "предполагаемое место краха" без проблем, где же правда?
это уже баг конкретной реализации. По умолчанию new (если не указана функция для выделения памяти) должна выбрасывать исключение. Любое другое поведение — это уже отклонение от стандарта. Хотя, в принципе, MS VC++ 6.0 как раз этим и славится. В то время как поведение GCC в данном случае адекватно требованиям стандарта.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Мне интересно услышать конкреное мнение, т.к. спор спором но граблей c badalloc в IDE c которыми работаю я не встречал: при невозможности выделения памяти даже в catch(badalloc) алгоритм не заходит, вот сижу и думу думаю...
а не нужно гадать, нужно просто почитать черновик стандарта
-=ЮрА=-
Заблокирован
Автор FAQ
17.03.2012, 11:07     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #37
Цитата Сообщение от Nameless One Посмотреть сообщение
Хотя, в принципе, MS VC++ 6.0 как раз этим и славится. В то время как поведение GCC в данном случае адекватно требованиям стандарта.
- я тестировал на 2008-й обижаешь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
 
int main()
{
    int * arr       = NULL;
    unsigned long n = 1000000000;
    for(int i = 0; i < 3; i++)
    {
        try
        {
            if(!(arr = new int[n]))
                cout<<"Allocation memory error\n";
            else
            {
                cout<<"Allocation done"<<endl
                    <<"Num of elements : "<<n<<endl
                    <<"Memory adress   : "<<arr<<endl;
            }
        }
        catch(bad_alloc &e)
        {
            cout<<e.what()<<endl;
            arr = NULL;
        }
    }
    system("pause");
    return 0;
}
Посмотри скрин работы приложения собранного в 9-ке(надо и скрины пошагового прохождения прилеплю, в catch не заходим). По поводу опций компилятора, как я понял GNU отстроен так чтобы линковать код выбрасывающий исключения, студия уже линкует с тем расчётом чтобы исключений не было. У меня вопрос - что лучше продумывать кучи реакций на исключительные ситуации, либо писать простенькие фильтры, а всё остальное за тебя сделает линковшик. Лично я за 2-й вариант. Так если посудить исключение может выбрасывать и scanf да и printf наверное, что весь код в try catch заворачивать?(какая-та глупость на мой взгляд)

На счёт случайных, долго пояснять - суть сводилась к тому что srand(time(NULL)) каждый раз засеивает внутренний генератор чисел одним и тем же начальным числом, думаю не нужно развивать тему как может отработать алгоритм при одних и тех же начальных условиях time(&t) в любом случае всегда вернёт отличное число(милисекунды то от 1970-го тикают всегда)
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.03.2012, 11:17     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #38
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Посмотри скрин работы приложения собранного в 9-ке(надо и скрины пошагового прохождения прилеплю, в catch не заходим). По поводу опций компилятора, как я понял GNU отстроен так чтобы линковать код выбрасывающий исключения, студия уже линкует с тем расчётом чтобы исключений не было. У меня вопрос - что лучше продумывать кучи реакций на исключительные ситуации, либо писать простенькие фильтры, а всё остальное за тебя сделает линковшик. Лично я за 2-й вариант. Так если посудить исключение может выбрасывать и scanf да и printf наверное, что весь код в try catch заворачивать?(какая-та глупость на мой взгляд)
извини, я не понял, выбрасывает ли код, скомпилированный cl.exe, исключение, или нет? Если да, то какая версия выбрасывает, а какая нет? (Как ты наверно догадался, сам я проверить не могу)

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
суть сводилась к тому что srand(time(NULL)) каждый раз засеивает внутренний генератор чисел одним и тем же начальным числом
нет, не одним и тем же

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю не нужно развивать тему как модет отработать алгоритм при одних и тех же начальных условиях time(&t) в любом случае всегда вернёт отличное число(милисекунды то от 1970-го тикают всегда)
srand(time(NULL)) и srand(time(&t)) будут работать одинаково всегда. От того, передашь ли ты функции time аргумент или нет, не зависит ее возвращаемое значение. Почитай документацию на функцию time
-=ЮрА=-
Заблокирован
Автор FAQ
18.03.2012, 10:40     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #39
Цитата Сообщение от Nameless One Посмотреть сообщение
От того, передашь ли ты функции time аргумент или нет, не зависит ее возвращаемое значение.
- однако посмотри на скрин а также компиляцию этого алгоритма
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <time.h>
 
int main()
{
    int i = 0;
    for(; i < 10; i++)
        printf("%u\n",time(NULL));
    printf("Press any key to continue\n");
    getchar();
    return 0;
}
http://codepad.org/qIYNWBC6
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 10:47     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М
Еще ссылки по теме:

C++ Найти количество элементов массива, значения которых положительны, и не больше заданного числа
Найти сумму элементов массива, порядковые номера которых - простые числа C++
C++ Найти произведение элементов массива, результат умножения цифр которых больше заданного К

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
18.03.2012, 10:47     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М #40
На счёт студии, не хочу резать скрины однако скажу что даже при пошаговом прохождении
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
try
* * * * * * * * {
* * * * * * * * * * * * if(!(arr = new int[n]))
* * * * * * * * * * * * * * * * cout<<"Allocation memory error\n";
* * * * * * * * * * * * else
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * cout<<"Allocation done"<<endl
* * * * * * * * * * * * * * * * * * * * <<"Num of elements : "<<n<<endl
* * * * * * * * * * * * * * * * * * * * <<"Memory adress * : "<<arr<<endl;
* * * * * * * * * * * * }
* * * * * * * * }
* * * * * * * * catch(bad_alloc &e)
* * * * * * * * {
* * * * * * * * * * * * cout<<e.what()<<endl;
* * * * * * * * * * * * arr = NULL;
* * * * * * * * }
- в catch ветвь не заходим. Я и писал что студия линкует без генерации bad_alloc (тест делал на 2008-й версии, с релиза остальных версий прошло менее 3-х лет и использовать их нельзя - есть такой принцип, обкатай 3 года дождись от разработчика пакетов с аддонами и исправлениями а потом уже пиши, так что 10-ку не пробовал)

Добавлено через 4 минуты
Грешным делом подумал вдруг за 10-ть итераций time(NULL) не успевает изменить возвращаемое значение И запустил тест 100 тыс http://codepad.org/cCwx2uLg
2309 1332053092
2310 1332053093
да тик уже виден, про time(NULL) вопрос снял, однако за bad_alloc всё в силе
Yandex
Объявления
18.03.2012, 10:47     Найти сумму первых элементов массива, произведение которых не превышает заданного числа М
Закрытая тема Создать тему
Опции темы

Текущее время: 04:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru