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

Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
04.03.2011, 22:32     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #1
Дана матрица a (а1,а2,а3...аn)
Найти сумму тех элементов,при которых уравнение X^2+3a[i]x+5=0
Если таких элементов нет,вывести 0.


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//Trvac e (a1,a2,...an) miachaph zangvac. Gtnel ayn tarreri gumary, voronc depqum
//X2+3aix+5=0 qarakusi havasarumn uni irakan armatner. Ete aydpisi elementner chkan, apa tpel 0.
 
//----------------------------
 
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
 
using namespace std;
 
void inp(int* y,int n);
void out(int* y,int n);
int calc(int* y,int n,int& x1,int& x2);
bool Dcheck(int a);
void D(int a,int& x1,int& x2);
 
 
void main()
{
    int n;
    int x1,x2;
    cout<<"n=";
    cin>>n;
 
    int* y=new int[n];
    inp(y,n);
    out(y,n);
    int s=calc(y,n,x1,x2);
    
 
    cout<<"x1="<<x1<<endl<<"x2="<<x2<<endl<<"summa="<<s<<endl;
    
}
 
void inp(int* y,int n)
{
    srand(time(0));
    
    for(int i=0;i<n;i++)
        *(y+i)=rand()%10;
}
 
void out(int* y,int n)
{
    for(int i=0;i<n;i++)
        cout<<*(y+i)<<" ";
    cout<<endl;
 
}
 
bool Dcheck(int a)
{
    //X2+3ax+5=0
    bool t;
    double x1,x2;
    double d;
    d=(3*a)*(3*a)-20;
    x1=((-(3*a))-sqrt(d))/2;
    x2=((-(3*a))+sqrt(d))/2;
    if(x1==(int)x1 && x2==(int)x2)
        t=true;
    else
        t=false;
    
    return t;
}
 
void D(int a,int& x1 ,int&x2)
{
    double d;
    d=(3*a)*(3*a)-20;
    x1=((-(3*a))-sqrt(d))/2;
    x2=((-(3*a))+sqrt(d))/2;
}
 
int calc(int* y,int n,int& x1,int& x2)
{
    int s=0;
    int i=0;
    
        for(i=0;i<n;i++)
        {
            s+=*(y+i);
            if(Dcheck(s)==1)
            {
            D(s,x1,x2);
            i=n;
            break;
            }
 
            if(i==n-1)
                i=0;
        }
    return s;
}

что не так я сделал?

PS если что то не так,то не надо код, объясните словами, если никак не пойму,попрошу код.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2011, 22:32     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение
Посмотрите здесь:

Функция: посчитать сумму элементов динамического массива, перераспределить память и добавить сумму в конец C++
Создать программу, которая будет сообщать на экран, сколько корней имеет квадратное уравнение ax²+bx+c=0. C++
Найти сумму тех из элементов a2j(j=1,...,m), для которых a1j имеет значение наибольшего среди значений a11, a12,...,a1m C++
C++ Найти сумму тех из элементов a2j(j=1,...,m), для которых a1j имеет значение наибольшего среди значений
C++ Посчитать квадратное уравнение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.03.2011, 22:41     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #2
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
Найти сумму тех элементов,при которых уравнение X^2+3a[i]x+5=0
Если таких элементов нет,вывести 0.
для этой задачи достаточно посчитать дискриминант

и зачем повторять одни и теже расчеты в D и Dcheck ?
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
04.03.2011, 23:26  [ТС]     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #3
Maxwe11, я не знаю...
дискриминант я посчитал
а как посчитать сумму тех,с помощью которых корни- целые числа?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.03.2011, 23:58     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #4
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
а как посчитать сумму тех,с помощью которых корни- целые числа?
сначала находить корни с плавающей точкой потом преобразовывать в целое и подставлять в уравнение
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.03.2011, 00:03  [ТС]     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #5
Maxwe11, как?
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
05.03.2011, 02:01     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #6
^Tecktonik_KiLLeR, проверяешь дискриминант: D>=0. Так находишь все вещественные корни.
Далее проверяешь целое ли число, вроде так должно работать:
C++
1
if (x1-(int)x1 == 0 && x2-(int)x2 == 0) { }
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.03.2011, 11:37  [ТС]     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #7
almazsr,ну и что потом?Что то не пойму,отредактировайте мой код пожалуйста с вашими вариантами
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
05.03.2011, 15:03     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #8
Если имеются в виду целые корни, то вот так можно сделать:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/////////////////////////////////////////////////////////////////////////////////////////
//Дан массив a (а1,а2,а3...аn)
//Найти сумму тех элементов,при которых уравнение X^2+3a[i]x+5=0 имеет целые корни.
//Если таких элементов нет, вывести 0.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef int                 T_num;
typedef std::vector<T_num>  T_nums;
/////////////////////////////////////////////////////////////////////////////////////////
T_nums  get_random_arr
    (
        T_num  size,
        T_num  mod
    )
{
    struct  T_gen_num_for_mod
    {
        T_num  mod_;
        //-------------------------------------------------------------------------------
        T_gen_num_for_mod(T_num  mod) : mod_(mod)
        {}
        //-------------------------------------------------------------------------------
        T_num  operator()()
        {
            return  rand() % (mod_ * 2 + 1) - mod_;
        }
    };
 
    T_nums  nums;
    std::generate_n(std::back_inserter(nums), size, T_gen_num_for_mod(mod));
    return  nums;
}
/////////////////////////////////////////////////////////////////////////////////////////
void  print_nums(const T_nums&  nums)
{
    std::copy(nums.begin(), nums.end(), std::ostream_iterator<T_num>(std::cout, "\t"));
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    srand(static_cast<unsigned>(time(0)));
    const T_num ARR_SIZE =  40;
    const T_num ARR_MOD =   10;
 
    T_nums  nums = get_random_arr(ARR_SIZE, ARR_MOD);    
    std::cout << "Исходный массив A: "
              << std::endl;    
    print_nums(nums);
    std::cout << std::endl;
 
    struct  T_root_is_not_int
    {
        bool  operator() (T_num  num)
        {
            T_num  D = (3 * num) * (3 * num) - 4 * 1 * 5;
            if(D < 0) 
            {
                return  true;
            }
            else
            {                
                T_num  sqrt_int_D  = static_cast<T_num>(pow(D, 0.5));
                T_num  d           = 0;
                if(D == sqrt_int_D * sqrt_int_D)
                {
                    d = sqrt_int_D;
                }
                else if(D == (sqrt_int_D + 1) * (sqrt_int_D + 1))
                {
                    d = sqrt_int_D + 1;
                }
                else  return  true;
 
                return (3 * num) % 2 != d % 2;
            }
        }
    };
 
    T_nums  good_nums;
    std::remove_copy_if(nums.begin(), nums.end(), std::back_inserter(good_nums),
                        T_root_is_not_int());
 
    std::cout << "Элементы массива A, для которых уравнение x^2 + 3*A[i]*x + 5 = 0 "
              << std::endl
              << "имеет целые корни:"
              << std::endl;
    print_nums(good_nums);
    std::cout << std::endl
              << "Сумма этих элементов равна "
              << std::accumulate(good_nums.begin(), good_nums.end(), 0)
              << "."
              << std::endl;
}
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
05.03.2011, 19:24  [ТС]     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #9
Mr.X, пожалуйста,я не знаком с этими типами, или же функциями...нельзя ли просто отредактировать мой код,используя только то что там есть?Дин. память, указатели и т.д.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
08.03.2011, 22:11  [ТС]     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #10
Проверьте код пожалуйста,я написал его
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//Trvac e (a1,a2,...an) miachaph zangvac. Gtnel ayn tarreri gumary, voronc depqum
//X2+3aix+5=0 qarakusi havasarumn uni irakan armatner. Ete aydpisi elementner chkan, apa tpel 0.
 
//----------------------------
 
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
 
using namespace std;
 
void inp(int* y,int n);         //input of matrix
void out(int* y,int n);         //output of matrix
int calc(int* y,int n);         //calc function
bool Dcheck(int a);         //checking for real roots
 
 
 
void main()
{
    int n;          //matrix size
    cout<<"n=";         //input of size
    cin>>n;
 
    int* y=new int[n];      //creating
    inp(y,n);               //input matrix
    out(y,n);           //output
    int s=calc(y,n);        //calling calc function
 
    cout<<"Summa="<<s<<endl;        //result
    
}
 
void inp(int* y,int n)
{
    srand(time(0));
    
    for(int i=0;i<n;i++)
        *(y+i)=rand()%10;
}
 
void out(int* y,int n)
{
    for(int i=0;i<n;i++)
        cout<<*(y+i)<<" ";
    cout<<endl;
 
}
 
bool Dcheck(int a)
{
    //X2+3ax+5=0
    bool t;         //answer
    double x1,x2;       //roots
    double d;           //descriminant
    d=(3*a)*(3*a)-20;       //d=b^2-4ac
 
        if(d<0)         
            return 0;
        if(d==0)        //x=-b+-0/2a
        {
            x1=(-(3*a))/2;
            x2=x1;
        }
 
        else
        {
            x1=((-(3*a))-sqrt(d))/2;        
            x2=((-(3*a))+sqrt(d))/2;
        }
 
    if(x1==(int)x1 && x2==(int)x2)          //ex. 5.0 = 5
        t=true;
    else            //ex 5.1 != 5
        t=false;
    
    return t;
}
int calc(int* y,int n)
{
    int s=0;            //summa
    int i=0;            //index
    
        for(i=0;i<n;i++)
        {
            if(Dcheck(*(y+i))==1)
            {
                cout<<"The number="<<*(y+i)<<endl;          
                s+=*(y+i);
            }
        }
    return s;
}
Добавлено через 55 секунд
В уравнении X2+3aix+5=0 где аi это очередной элемент массива, корни бывают реальные только тогда,когда a[i]==2
Почему же так?В смысле правильно это?

Добавлено через 11 минут
вот написал такой код...
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
bool Dcheck(int a);         //checking for real roots
 
void main()
{
    for(int i=0;i<=9999;i++)
        if(Dcheck(i)==1)
            cout<<i<<endl;
}
bool Dcheck(int a)
{
        //X2+3ax+5=0
        bool t;                 //answer
        double x1,x2;           //roots
        double d;                       //descriminant
        d=(3*a)*(3*a)-20;               //d=b^2-4ac
 
                if(d<0)                 
                        return 0;
                if(d==0)                //x=-b+-0/2a
                {
                        x1=(-(3*a))/2;
                        x2=x1;
                }
 
                else
                {
                        x1=((-(3*a))-sqrt(d))/2;                
                        x2=((-(3*a))+sqrt(d))/2;
                }
 
        if(x1==(int)x1 && x2==(int)x2)                  //ex. 5.0 = 5
                t=true;
        else                    //ex 5.1 != 5
                t=false;
        
        return t;
}
ответ - 2
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
09.03.2011, 05:38     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если имеются в виду действительные корни, то вот так можно сделать:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/////////////////////////////////////////////////////////////////////////////////////////
//Дан массив a (а1,а2,а3...аn)
//Найти сумму тех элементов,при которых уравнение X^2+3a[i]x+5=0 имеет действительные корни.
//Если таких элементов нет, вывести 0.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef int                 T_num;
typedef std::vector<T_num>  T_nums;
/////////////////////////////////////////////////////////////////////////////////////////
T_nums  get_random_arr
    (
        T_num  size,
        T_num  mod
    )
{
    struct  T_gen_num_for_mod
    {
        T_num  mod_;
        //-------------------------------------------------------------------------------
        T_gen_num_for_mod(T_num  mod) : mod_(mod)
        {}
        //-------------------------------------------------------------------------------
        T_num  operator()()
        {
            return  rand() % (mod_ * 2 + 1) - mod_;
        }
    };
 
    T_nums  nums;
    std::generate_n(std::back_inserter(nums), size, T_gen_num_for_mod(mod));
    return  nums;
}
/////////////////////////////////////////////////////////////////////////////////////////
void  print_nums(const T_nums&  nums)
{
    std::copy(nums.begin(), nums.end(), std::ostream_iterator<T_num>(std::cout, "\t"));
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    srand(static_cast<unsigned>(time(0)));
    const T_num ARR_SIZE =  40;
    const T_num ARR_MOD =   10;
 
    T_nums  nums = get_random_arr(ARR_SIZE, ARR_MOD);    
    std::cout << "Исходный массив A: "
              << std::endl;    
    print_nums(nums);
    std::cout << std::endl;
 
    struct  T_root_is_complex
    {
        bool  operator() (T_num  num)
        {
            T_num  D = (3 * num) * (3 * num) - 4 * 1 * 5;
            return  D < 0;
        }
    };
 
    T_nums  good_nums;
    std::remove_copy_if(nums.begin(), nums.end(), std::back_inserter(good_nums),
                        T_root_is_complex());
 
    std::cout << "Элементы массива A, для которых уравнение x^2 + 3*A[i]*x + 5 = 0 "
              << std::endl
              << "имеет действительные корни:"
              << std::endl;
    print_nums(good_nums);
    std::cout << std::endl
              << "Сумма этих элементов равна "
              << std::accumulate(good_nums.begin(), good_nums.end(), 0)
              << "."
              << std::endl;
}
Корни действительные при |A[i]| >= sqrt(20 / 9), а если значения A[i] целые, то при |A[i]| >= 2.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 11:01     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение
Еще ссылки по теме:

Найти среди элементов массива два, модуль разности которых имеет наибольшее значение C++
В одномерном массиве посчитать сумму элементов, номера которых являются простыми числами C++
C++ Посчитать сумму элементов массива, порядковый номер которых в матрице будет кратен 3

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

Или воспользуйтесь поиском по форуму:
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
09.03.2011, 11:01     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
44
45
46
47
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
bool isroot(double a, double b, double c, double param)
{
    double discriminant=(param*b)*(param*b)-4*c*a;
    if (discriminant>=0)
    {
        double x1=(-(param*b)+sqrt(discriminant))/(2*a), x2=(-(param*b)-sqrt(discriminant))/(2*a);
        if (x1-(int)x1 == 0 && x2-(int)x2 == 0) 
        {
            return true;
        }
    }
    return false;
}
 
void input_array(int* a, int n)
{
    for (int i=0; i<n; i++)
    {
        std::cin>>a[i];
    }
}
 
int main()
{
    int n, k=0;
    double a, b, c;
    std::cout<<"Enter a, b, c constants: ";
    std::cin>>a>>b>>c;
    std::cout<<"Enter count of elements in array: ";
    std::cin>>n;
    std::cout<<"Enter elements in array: ";
    int* arr=new int[n];
    input_array(arr,n);
    for (int i=0; i<n; i++)
    {
        if (isroot(a,b,c,arr[i]))
        {
            std::cout<<arr[i]<<' ';
        }
    }
    _getch();
    return 0;
}
Yandex
Объявления
09.03.2011, 11:01     Посчитать сумму элементов массива, при которых квадратное уравнение имеет решение
Ответ Создать тему
Опции темы

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