0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
1

Неожиданное поведение программы: почему не работает цикл while?

25.09.2016, 09:47. Показов 3214. Ответов 16
Метки нет (Все метки)

Проблема: Цикл While при != является бесконечным ,а при == не выполняется ни разу
Ожидаемое поведение: После входа в цикл N должно быть равно P^2+ Q^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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*Альберт хочет представить некоторое целое положительное число N в виде сумме квадратов двух целых положительных чисел P и Q(0<P <= Q).
Это не всегда возможно.Если точного разло - жения не существует, Альберту нужно подобрать такие P и Q, чтобы значение выражения
| N–P2–Q2 | было минимальным.Если существует несколько вариантов разложения, 
минимизиру - ющих значение указанного выражения, то вывести вариант с меньшим Q.
Напишите программу, которая вводит с клавиатуры целое число N(1 <= N <= 106) и выводит на экран целые значения P и Q.
*/ 
 
#include "stdafx.h"
#include <iostream>
#include <math.h>
 
using namespace std;
 
int _tmain()
{
    int N = 0; 
    unsigned int P = 0, Q = 0; //два целых положительных числа 
    int P2=0, Q2=0;
    if (N >= 1 || N <= 1E6) //некоторое целое положительное число N
    cout << "Введите число от 1 до 1.000.000" << endl;
    cin >> N ;
    if (0 < P <= Q) //Это не всегда возможно 
    {
        while (N != (P*P + Q*Q)) {
            P++;
            N = P*P + Q*Q;
            Q++;
        }  //Cумма квадратов двух целых положительных чисел 
    
        
        cout << P << Q << endl;
 
    }
    else                      //нужно подобрать такие P и Q, чтобы значение выражения | N–P2–Q2 |
                              //было минимальным
    {
        abs (N-P2-Q2); 
                                //Если существует несколько вариантов разложения,
                                //минимизирующих значение указанного выражения, 
                                //то вывести вариант с меньшим Q
 
        cout << P << Q << endl;
    }
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2016, 09:47
Ответы с готовыми решениями:

Неожиданное поведение программы: почему не работает цикл do while?
Здравствуйте,подскажите,пожалуйста,почему не работает цикл ... Условие корявое? //Напишите...

Неожиданное поведение программы: почему программа внезапно завершает работу?
Писал в codeblocks с компилятором gnu gcc. После запуска и ввода данных завершается работа...

Неожиданное поведение программы: почему при делени с остатком, в условии if получается true?
Ребят не могу понять #define N 64 int length=12; if ((N - 1) % matrix != 0) В переменной...

Неожиданное поведение программы: почему на консоль не выводятся крайние значения заданного диапазона?
Помогите, пожалуйста, наити ошибку!? Не выводится крайнее значение, то есть если брать от -2 до 3х,...

16
7176 / 6148 / 2805
Регистрация: 14.04.2014
Сообщений: 26,515
25.09.2016, 09:49 2
Входные данные какие?
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 10:35 3
Цитата Сообщение от Sh_a_man Посмотреть сообщение
0 < P <= Q
Такое чудо работает в Питоне, но не в C++.
Да и в строках 25-27 написана чушь.
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 11:52  [ТС] 4
Цитата Сообщение от nonedark2008 Посмотреть сообщение
чушь
Вот такая у меня логика)

Добавлено через 26 секунд
Цитата Сообщение от nmcf Посмотреть сообщение
Входные данные какие?
В 1-6 строках условие задачи

Добавлено через 1 минуту
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Такое чудо работает в Питоне, но не в C++.
В условии задачи так написано (
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 13:27 5
Цитата Сообщение от Sh_a_man Посмотреть сообщение
В условии задачи так написано (
Псевдокод - это одно, а непосредственная его реализация на каком-либо языке программирования - это другое.
Раздей это свое условия на части.
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Вот такая у меня логика)
Каждую итерацию цикла у тебя и P, и Q увеличиваются на 1.
Условие цикла будет всегда выполняться, т.к. будет верным https://www.cyberforum.ru/cgi-bin/latex.cgi?N=P^2+(Q-1)^2 \neq P^2+Q^2

Распиши, что ты планировал сделать.
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 13:41  [ТС] 6
Цитата Сообщение от nonedark2008 Посмотреть сообщение
что ты планировал
Планировал решить задачу

Добавлено через 4 минуты
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Распиши
В универе всего полмесяца изучаем С++ . Иду вперед программы ,поэтому не знаю как решать . Циклы только начали проходить.
1)Планировал в цикле посчитать значения Q и P ,сравнивая каждый раз с значением N.Если значение не совпадает , то повторить цикл.

2)Если существует несколько вариантов разложения, минимизирующих значение указанного выражения, то вывести вариант с меньшим Q

Добавлено через 2 минуты
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Разбей свое условия на части
C++
1
if (0 < P && P <= Q)
так?
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 14:05 7
Цитата Сообщение от Sh_a_man Посмотреть сообщение
так?
Ага

Цитата Сообщение от Sh_a_man Посмотреть сообщение
,сравнивая каждый раз с значением N
Но вот беда, в строке 26 ты в N что-то присваиваешь. Было у тебя старое N, да не стало, теперь и сравнивать не с чем.

Sh_a_man, могу предложить в качестве начального значения P взять https://www.cyberforum.ru/cgi-bin/latex.cgi?\left \lfloor \sqrt{N} \right \rfloor и в качестве Q такое же значение от остатка. Далее уменьшаешь P, перевычисляешь Q, запоминаешь минимум и так до тех пор, пока Q не привысит P.
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 14:28  [ТС] 8
Цитата Сообщение от nonedark2008 Посмотреть сообщение
в строке 26 ты в N что-то присваиваешь
А...точно...если в условии указано выражение,которое проверяется ... то в теле цикла его не надо указывать?
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 15:01 9
Цитата Сообщение от Sh_a_man Посмотреть сообщение
то в теле цикла его не надо указывать
Как напишешь, таки будет работать. Иногда это необходимо, а иногда нет.
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 15:32  [ТС] 10
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Как напишешь
Да-а-а-а-а...правило -"программист всегда прав"

Добавлено через 7 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
значения P взять https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{N} и в качестве Q такое же значение от остатка
А можно поподробнее? С помощью fmod и floor ?
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 15:53 11
Для твоей задачи верно https://www.cyberforum.ru/cgi-bin/latex.cgi?P^2+Q^2 <= N
Шаг 1: Выбираешь наибольшее возможное целое P. Очевидно, что это нижняя граница от https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{N}
Шаг 2: Выбираешь максимальное Q такое, что https://www.cyberforum.ru/cgi-bin/latex.cgi?Q^2 \leq N - P^2
Шаг 3: Уменьшаешь P, повторяешь шаг 2, пока не переберешь все варианты.
Шаг 4: Значения P и Q, прикоторых впервые будет достигнуто наименьшее значение https://www.cyberforum.ru/cgi-bin/latex.cgi?N - P^2+Q^2 и будет твоим ответом.

Можно начать перебор с Q от нуля до нижней границы от https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{N} аналогичным образом.

Добавлено через 2 минуты
Ах, я и не посмотрел, что там это все идет по модулю у тебя.
Тогда все выше сказанное отменяется.

Добавлено через 5 минут
Нужно перебирать не от нижней границы, а от верхней.
В качестве метрики нужно брать https://www.cyberforum.ru/cgi-bin/latex.cgi?|N-P^2-Q^2|, а если https://www.cyberforum.ru/cgi-bin/latex.cgi?Q^2 \leq N-P^2 не выполняется ни для какого Q, то брать https://www.cyberforum.ru/cgi-bin/latex.cgi?Q=0. В остальном идея та же.
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 16:05  [ТС] 12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
от нуля до нижней границы
А как это записать?
C++
1
 Q(Q=>0 || sqrt (N) <= Q)
Добавлено через 5 минут
nonedark2008,
Тесты для проверки
25 3 4
2581 30 41
9 2 2
9999 60 80
888888 534 777

У меня получается 25 = 5 0 ...
C++
1
2
3
4
5
6
while (P*P+Q+Q <= N)
        P++, Q++;
        if (0 < P && P <= Q)
        {
            P = floor (sqrt(N));
            Q = sqrt(N - P*P);
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 16:22 13
Цитата Сообщение от Sh_a_man Посмотреть сообщение
=>
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Иду вперед программы
Лучше не иди, а подробней изучи основы основ.

Цитата Сообщение от Sh_a_man Посмотреть сообщение
А как это записать?
Лучше от единицы шагать. Условие в цикле возможно будет каким-то таким: Q <= ceil(sqrt(N))
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 16:34  [ТС] 14
Цитата Сообщение от nonedark2008 Посмотреть сообщение
изучи
Как раз сейчас и изучаю по учебнику
У меня скорее проблемы с математикой уже)
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Условие
А зачем округлять до ближайшего целого?
Если даются корни ,которые извлекаются.

Добавлено через 6 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Лучше не иди,
Не получается "не идти", на следующей паре мы все равно должны будем решать данную программу, а лекция будет только позже ... если я не решу эту программу, то потрачу 1,5 часа своего времени зря ,так как все равно не буду знать, что делать
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 16:48 15
Лучший ответ Сообщение было отмечено Sh_a_man как решение

Решение

Цитата Сообщение от Sh_a_man Посмотреть сообщение
Если даются корни ,которые извлекаются.
Ну есть у тебя N = 5, извлеки из него целый корень. Я бы сказал, что ответ тут либо 2, либо 3, зависит от того, куда округлять.

Ты похоже свою задачу не понимаешь. Не любое число раскладывается на сумму двух квадратов, например посмотри на числе 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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main() {
    int N, P, Q;
    int minM = 100000, minP, minQ;
    cin >> N;
 
    Q = 1;
    while (Q <= (int)ceil(sqrt(N))) {
        int P2 = N - Q * Q;
        if (P2 <= 0)
            P2 = 1;
        P = floor(sqrt(P2));
        if (P <= Q && abs(N - Q * Q - P * P) < minM) {
            minM = abs(N - Q * Q - P * P);
            minP = P;
            minQ = Q;
        }
        P = ceil(sqrt(P2));
        if (P <= Q && abs(N - Q * Q - P * P) < minM) {
            minM = abs(N - Q * Q - P * P);
            minP = P;
            minQ = Q;
        }
        Q += 1;
    }
 
    cout << minM << " " << minP << " " << minQ << endl;
 
    return 0;
}
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
25.09.2016, 17:21  [ТС] 16
Цитата Сообщение от nonedark2008 Посмотреть сообщение
P = ceil(sqrt(P2));
Не компилируется из-за преобразования double в int ...все...решил ...добавил указания (int)

Добавлено через 17 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
minM
Что это такое?
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
25.09.2016, 17:26 17
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Что это такое?
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Альберту нужно подобрать такие P и Q, чтобы значение выражения | N–P2–Q2 | было минимальным.
Вот значение того модуля и есть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2016, 17:26
Помогаю со студенческими работами здесь

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

Неожиданное поведение программы: почему после каждой выведенной фразы в консоли появляются цифры?
почему после каждой выведенной фразы в консоли появляются цифры? например, Введите значение...

Неожиданное поведение программы: исправить ошибку в коде
извиняюсь за возможно глупый вопрос, но почему программа говорит,что в выделенной строке ошибка?...

Неожиданное поведение программы: найти ошибку в коде
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100....


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru