Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
1

Бинарный поиск с соблюдением теоремы Пифагора

24.05.2015, 18:45. Показов 1105. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.

На input подается число (s), которое является суммой чисел a, b, c, которые предстоит найти.
Условие следующее:
a+b+c должно быть равно s (a+b+c = s) и должна соблюдаться теорема Пифагора, тоесть (pow(a, 2) + pow(b, 2) = pow(c, 2))
На output надо вывести pow(c, 2).

На вход числа идут большие (10e+7), так что циклами или тому подобным делать глупо. Решил бинарным поиском сделать, вот код:
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
//Pythagorean Triples
 
#include <iostream>
#include <cmath>
using namespace std;
 
int binSearch(int Begin, int End, int s)
{
    int a = (Begin+End) / 2, c, cPow, abPow;
 
    for(int b = a+1; b < End; b++)
    {
        c = s-a-b;
        abPow = pow(a, 2) + pow(b, 2);
        cPow = pow(c, 2);
 
        if(c > b && abPow == cPow)
            return cPow;
    }
 
    cPow = abPow > cPow ? binSearch(Begin, a, s) : binSearch(a, End, s);
 
    return cPow;
}
 
int main()
{
    int N;
    cin >> N;
    int *Ss = new int[N]; // Массив случаев (значений s)
    for(int i = 0; i < N; i++)
        cin >> Ss[i];
 
    for(int i = 0; i < N; i++)
        cout << binSearch(1, Ss[i], Ss[i]) << " ";
 
    delete[] Ss;
 
    return 0;
}
Единственное, что я не знаю, как должна выгледить строка входа в рекурсию
C++
1
cPow = abPow > cPow ? binSearch(Begin, a, s) : binSearch(a, End, s);
Подскажите, как исправить эту строку, чтоб программа работала, либо, если вам кажется, что решение глупое и есть намного просче, то буду презнателен, если вы мне дадите на него наводку
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2015, 18:45
Ответы с готовыми решениями:

Новая интерпретация теоремы Пифагора
По Пифагору: Дан прямоугольный треугольник. Строим на его сторонах по квадрату. И площадь...

Ошибка в расчете теоремы Пифагора
написал функцию вычисляющию по теорему пифагора пишет синтаксис eror Public Function Пифагор...

Программа выводит числа a,b и c не более 25, для которых верно равенство теоремы пифагора т.е a2+b2=c2
Программа выводит числа a,b и c не более 25, для которых верно равенство теоремы пифагора т.е...

Поиск больших простых чисел с использованием малой теоремы Ферма
Всем доброго времени суток. Мне нужно найти очень большое простое число и я решил воспользоваться...

19
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
24.05.2015, 21:02 2
Привет. Возможно я опять что-то не учёл или где то нарушил)) но вот как бы я решил эту задачу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<cmath>
 
using namespace std;
 
double s;
 
int main()
{
    cout << "Inpu s" << endl;
    cin >> s; //s=a+b+c
 
    double cc, ss;
 
    ss = pow(s, 2); //(s^2)=(a^2)+(b^2)+(c^2)
 
    cc = (ss / 2); //(c^2)=(a^2)+(b^2)
 
    cout << "C^2 =" << cc<<endl;
 
    system("pause");
    return 0;
}
В итоге мы нашли с^2 ))))
0
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
24.05.2015, 21:11 3
Цитата Сообщение от mster-doc Посмотреть сообщение
(s^2)=(a^2)+(b^2)+(c^2)
ясно
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
24.05.2015, 21:15  [ТС] 4
mster-doc, нет, к сожалению, ваш метод не работает
0
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
24.05.2015, 21:15 5
Да, налажал.....И о чём я думал.... Удалите ответ кто может)))
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
25.05.2015, 13:57  [ТС] 6
Тема еще не закрыта. Неужели никто не знает, как решить данную задачу?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
25.05.2015, 15:41 7
https://www.cyberforum.ru/cgi-bin/latex.cgi?{\left(a + b+ c  \right)}^{2} = {a}^{2} + {b}^{2} + {c}^{2} + 2ab + 2bc + 2ac = {s}^{2}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{2} + {b}^{2} + {c}^{2} = {s}^{2}
Или
https://www.cyberforum.ru/cgi-bin/latex.cgi?ab + bc + ac = 0
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
25.05.2015, 15:56  [ТС] 8
Ilot,
Это как?
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{2}+{b}^{2}+{c}^{2}+2ab+2bc+2ac = {a}^{2}+{b}^{2}+{c}^{2}
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
25.05.2015, 16:12 9
Цитата Сообщение от Leonman Посмотреть сообщение
Это как?
Это вот так:
https://www.cyberforum.ru/cgi-bin/latex.cgi?ab + bc + ac = 0
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
25.05.2015, 16:36  [ТС] 10
Ilot,
А почему это так?
https://www.cyberforum.ru/cgi-bin/latex.cgi?ab+bc+ac = 0
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
25.05.2015, 16:37 11
Цитата Сообщение от Leonman Посмотреть сообщение
А почему это так?
Потому, что вот это так:
https://www.cyberforum.ru/cgi-bin/latex.cgi?{\left(a + b+ c  \right)}^{2} = {a}^{2} + {b}^{2} + {c}^{2} + 2ab + 2bc + 2ac = {s}^{2}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{2} + {b}^{2} + {c}^{2} = {s}^{2}
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
26.05.2015, 03:13  [ТС] 12
Ilot, Я не понимаю, что мне с этим делать.

Добавлено через 10 часов 34 минуты
Тема еще не закрыта, я до сих пор не смог найти решение задачи
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
26.05.2015, 08:04 13
А что тут думать? Из https://www.cyberforum.ru/cgi-bin/latex.cgi?ab+bc+ac = 0 следует, что если числа a, b, c положительные то данное условие не выполняется никогда. Если возможны отрицательные числа, то решений следующее.
Условие:
https://www.cyberforum.ru/cgi-bin/latex.cgi?ab+bc+ac = 0
https://www.cyberforum.ru/cgi-bin/latex.cgi?a + b + c = s
Выражаем a:
https://www.cyberforum.ru/cgi-bin/latex.cgi?bc + (b + c)(s - b - c) = 0
Или
https://www.cyberforum.ru/cgi-bin/latex.cgi?{b}^{2} - (s - c)b - (s-c)c = 0
Очевидно, что (s - c)c должно делиться на цело на b. Достаточно, что бы было b = c. В этом случае https://www.cyberforum.ru/cgi-bin/latex.cgi?b = \frac{2}{3}s, а если s - c = b, то а = 0.
И последний случай если (s - c)c делиться на b. Оставляю его вам как д/з.
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
26.05.2015, 15:30  [ТС] 14
Ilot, мы помоему говорим о разных вещах. Ну да ладно.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.05.2015, 23:23 15
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/////////////////////////////////////////////////////////////////////////////////////////
//На input подается число (s), которое является суммой чисел a, b, c, которые предстоит найти.
//Условие следующее:
//a+b+c должно быть равно s (a+b+c = s) и должна соблюдаться теорема Пифагора, то есть 
//(pow(a, 2) + pow(b, 2) = pow(c, 2))
//На output надо вывести pow(c, 2).
//
//На вход числа идут большие (10e+7),
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
bool    successfully_from_sum_of_sides_of_right_triangle_set_square_of_hypotenuse
    (
        long long       s,
        long long   &   hyp_square,
        long long   &   aa,
        long long   &   bb,
        long long   &   cc
    )
{
    bool    bool_res    =   s % 2   ==  0;
 
    if( bool_res )
    {
        double  k_max   =       ( 2 - sqrt(3.0)     )
                            /   2 * s;
 
        bool_res        =   k_max   >=  1;
 
        if( bool_res )
        {
            for( long long  k = 1; k < k_max; ++k )
            {
                long long   c           =   s / 2 - k;
                cc                      =   c;
                long long   ab          =   k * s;
                long long   a_plus_b    =   s - c;
                long long   D           =   a_plus_b * a_plus_b - 4 * ab;
                bool_res                =   D   >   0;
 
                if( !bool_res )
                {
                    continue;
                }
 
                long long   sqrt_D  =   long long   (
                                                        sqrt    (
                                                                    double( D )
                                                                )
                                                    );
 
                bool_res            =   D   ==  sqrt_D * sqrt_D;
 
                if( !bool_res )
                {
                    continue;
                }
 
                aa  =   a_plus_b / 2 - long long    (
                                                        sqrt    (
                                                                    double( D / 4 )
                                                                )
                                                    );
                bb  =   ab / aa;
 
                hyp_square  =   c * c;
 
                return  bool_res;
            }//for
        }//if
    }//if
 
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
template< typename  T >
bool    successfully_input_val( T   &   val )
{
    T_str   str_val;
    char    c   =   0;
    std::cin    >>  str_val;
    std::istringstream  ssin( str_val );
 
    return      ( ssin  >>  val     )   !=  0
            &&  ( ssin  >>  c       )   ==  0;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    long long   const   S_MAX   =   6000000000;
 
    for(;;)
    {
        std::cout   <<  std::endl
                    <<  std::endl;
 
        long long   s   =   0;
 
        do
        {
            std::cout   <<  "Введите s <="
                        <<  S_MAX
                        <<  "\t: ";
        }
        while   (
                        !successfully_input_val( s )
                    ||  s   >  S_MAX
                );
 
        long long   c_square    =   0;
        long long   a           =   0;
        long long   b           =   0;
        long long   c           =   0;
 
        if  (
                successfully_from_sum_of_sides_of_right_triangle_set_square_of_hypotenuse
                    (
                        s,
                        c_square,
                        a,
                        b,
                        c
                    )
            )
        {
            std::cout   <<  std::endl
                        <<  "a + b + c\t\t= "
                        <<  a + b + c
                        <<  std::endl
 
                        <<  "с^2\t\t\t= "
                        <<  c_square
                        <<  std::endl
 
                        <<  "a^a + b^b\t\t= "
                        <<  a * a + b * b
                        <<  std::endl
 
                        <<  "a\t\t\t= "
                        <<  a
                        <<  std::endl
 
                        <<  "b\t\t\t= "
                        <<  b
                        <<  std::endl
 
                        <<  "c\t\t\t= "
                        <<  c
                        <<  std::endl
                        <<  std::endl;
        }
        else
        {
            std::cout   <<  "Решения не существует."
                        <<  std::endl;
        }//else
    }//for
}
1
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
27.05.2015, 03:13  [ТС] 16
Mr.X, Спасибо за вариант. Разбирусь, протестирую и отпишусь.

Добавлено через 3 часа 35 минут
Mr.X, Спасибо. Разобрался. Ваш способ работает.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
27.05.2015, 08:10 17
Цитата Сообщение от Leonman Посмотреть сообщение
Ilot, мы помоему говорим о разных вещах. Ну да ладно.
Все верно. Я вас не правильно понял, но дабы загладить свою вину предлагаю вам альтернативное решение:
Прежде всего заметим, что:
https://www.cyberforum.ru/cgi-bin/latex.cgi?{\left(a + b \right)}^{2} = {\left(s -c \right)}^{2}
Или
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{2} + {b}^{2} + 2 ab = {s}^{2} + {c}^{2} - 2 sc
Учитывая, что
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{2} + {b}^{2} = {c}^{2}
Получим
https://www.cyberforum.ru/cgi-bin/latex.cgi?2 ab + 2 sc = {s}^{2}
Т.е. s должно быть четным и делиться на a и b. Поэтому достаточно найти делители числа s и проверять выполнение условий только для них:
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
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <vector>
typedef long long number;
int main() {
    number s;
    std::cout << "Input s: ";
    if(!(std::cin >> s))
        std::cerr << "Error input! " << std::endl;
    if(!(s & 1)) {
        number max_ab = s / 2;
        std::vector<number> vect;
        for(number denominator = 2; denominator <= max_ab; ++denominator)
            if(std::div(s, denominator).rem == 0)
                vect.push_back(denominator);
        for(number idx = 0; idx < vect.size(); ++idx)
            for(number idy = idx + 1; idy < vect.size(); ++idy)
                if(std::pow(vect[idx], 2) + std::pow(vect[idy], 2) == std::pow(s - vect[idx] - vect[idy], 2)) {
                    std::cout << "a = " << vect[idx]           << std::endl;
                    std::cout << "b = " << vect[idy]           << std::endl;
                    std::cout << "c = " << s - vect[idx] - vect[idy] << std::endl;
                    std::cout << std::endl;
                }
    }
}
1
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
27.05.2015, 09:32 18
Цитата Сообщение от Ilot Посмотреть сообщение
Т.е. s должно... делиться на a и b.
Откуда это следует?
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
27.05.2015, 11:48  [ТС] 19
Ilot, Спасибо за альтернативу. Только тоже интересно, откуда это следует?
Цитата Сообщение от Ilot Посмотреть сообщение
Т.е. s должно делиться на a и b
Добавлено через 8 минут
Ilot, Хм, потестил ваш вариант, из 10 тестов программа не выдала ни одного результата. (тоесть, из 10 раз программа в последний if не попала ни разу)
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
27.05.2015, 12:15 20
Leonman, знаю - мой косяк . Эт я что-то поторопился. Пробую переписать...
0
27.05.2015, 12:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2015, 12:15
Помогаю со студенческими работами здесь

Поиск заданного элемента в упорядоченном массиве (бинарный поиск)
Заполнить одномерный массив из n элементов согласно таблицы. Размерность массива задать в виде...

Поиск первого положительного элемента массива (бинарный поиск)
Нужен именно бинарный поиск,чтобы выводился первый положительный элемент из массива чисел(в массиве...

Поиск заданного элемента в упорядоченном массиве(бинарный поиск)
Заполнить одномерный массив из n элементов по формуле приведенной в картинке. Размерность массива...

Поиск числа в двумерном массиве (бинарный поиск)
Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru