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

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

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

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

На 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2015, 18:45
Ответы с готовыми решениями:

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

Ошибка в расчете теоремы Пифагора
написал функцию вычисляющию по теорему пифагора пишет синтаксис eror Public Function Пифагор (a As Single, b As Single) ‘аргументы а и...

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

19
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244
24.05.2015, 21:02
Привет. Возможно я опять что-то не учёл или где то нарушил)) но вот как бы я решил эту задачу.
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
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
24.05.2015, 21:11
Цитата Сообщение от mster-doc Посмотреть сообщение
(s^2)=(a^2)+(b^2)+(c^2)
ясно
0
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
24.05.2015, 21:15  [ТС]
mster-doc, нет, к сожалению, ваш метод не работает
0
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244
24.05.2015, 21:15
Да, налажал.....И о чём я думал.... Удалите ответ кто может)))
0
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
25.05.2015, 13:57  [ТС]
Тема еще не закрыта. Неужели никто не знает, как решить данную задачу?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
25.05.2015, 15:41
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
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
25.05.2015, 15:56  [ТС]
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
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
25.05.2015, 16:12
Цитата Сообщение от Leonman Посмотреть сообщение
Это как?
Это вот так:
https://www.cyberforum.ru/cgi-bin/latex.cgi?ab + bc + ac = 0
0
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
25.05.2015, 16:36  [ТС]
Ilot,
А почему это так?
https://www.cyberforum.ru/cgi-bin/latex.cgi?ab+bc+ac = 0
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
25.05.2015, 16:37
Цитата Сообщение от 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
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
26.05.2015, 03:13  [ТС]
Ilot, Я не понимаю, что мне с этим делать.

Добавлено через 10 часов 34 минуты
Тема еще не закрыта, я до сих пор не смог найти решение задачи
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
26.05.2015, 08:04
А что тут думать? Из 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
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
26.05.2015, 15:30  [ТС]
Ilot, мы помоему говорим о разных вещах. Ну да ладно.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.05.2015, 23:23
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
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
27.05.2015, 03:13  [ТС]
Mr.X, Спасибо за вариант. Разбирусь, протестирую и отпишусь.

Добавлено через 3 часа 35 минут
Mr.X, Спасибо. Разобрался. Ваш способ работает.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
27.05.2015, 08:10
Цитата Сообщение от 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
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
27.05.2015, 09:32
Цитата Сообщение от Ilot Посмотреть сообщение
Т.е. s должно... делиться на a и b.
Откуда это следует?
0
 Аватар для Leonman
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
27.05.2015, 11:48  [ТС]
Ilot, Спасибо за альтернативу. Только тоже интересно, откуда это следует?
Цитата Сообщение от Ilot Посмотреть сообщение
Т.е. s должно делиться на a и b
Добавлено через 8 минут
Ilot, Хм, потестил ваш вариант, из 10 тестов программа не выдала ни одного результата. (тоесть, из 10 раз программа в последний if не попала ни разу)
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
27.05.2015, 12:15
Leonman, знаю - мой косяк . Эт я что-то поторопился. Пробую переписать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2015, 12:15
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru