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

2 решения на turboC

22.11.2009, 19:26. Показов 2076. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1. Данно натуральное n. можно ли представить его в виде суммы трех квадратов натуральных чисел, если можно,то указать все представления n в виде суммы квадратов трех натуральных чисел...
2. Данны натуральные числа n и m. Получить все меньшие n натуральные числа, сумма кубов цифр которых равна м...
Заранее всм спасибо...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2009, 19:26
Ответы с готовыми решениями:

Windows 7 и TurboC
У меня Windows 7 домашняя расширенная х64. Мне нужен TurboC для написания прог по архитектуре, но...

Переведите в язык TurboC, пожалуйста
program pr_6; var i, n, m: integer; d, b: string; err: boolean; begin repeat ...

Сложение двух чисел на TurboC++
Всем привет! Подскажите, в чем ошибка с переменной с? Вот скрины - Коды программ надо...

Найти среднее арифметическое в TurboC
Нужно написать программу в ТурбоСи, которая будет выводить среднее арифметическое и геометрическое...

15
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
22.11.2009, 19:51 2
есть решение очень похожей на вашу первую задачу (Дано натуральное n. Указать x,y,z таких натуральных чисел, что n=x^2 +y^2 +z^2 и x<=y<=z .) но оно на С++, если разберётесь выложу
0
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 11
22.11.2009, 19:52  [ТС] 3
сбросьте, посмотрю...
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
22.11.2009, 19:55 4
для второй задачи приведите пример, в принципе понятно, но не мешало бы уточнить

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
#include <iostream>
#include <cmath>
 
//  Дано натуральное n.  Указать x,y,z таких натуральных чисел, что n=x2 +y2 +z2  и x<=y<=z . 
 
using namespace std;
 
bool findSummSquare(int n, int & x, int & y, int & z)
{
    if(n<0) return false;
 
    for (int i=(int)sqrt((double)n); i>=0; i--)
    {
        z=i;
        for (int j=(int)sqrt((double)n-i*i); j>=0; j--)
        {
            y=j;
            for (int k=(int)sqrt((double)n-i*i-j*j); k>=0; k--)
            {
                x=k;
                //cout<<"x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
                if (n==(x*x+y*y+z*z)) return true;
            }   // end for (int k
        }   // end for (int j   
    }   // end for (int i
 
    return false;
}   // end  findSummSquare
int main()
{
    int n=0, remains;
    int x, y, z;
    //cout<<"Enter n: "; cin>>n;
    while(n>=0)
    {
 
        if(!findSummSquare(n,x,y,z))        cout<<"ERR: "<<n<<endl;
        else
        {
            cout<<"x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
            cout<<n<<"="<<x*x<<"+"<<y*y<<"+"<<z*z<<endl;
        }       
        system("pause");
        ++n;
    }
    system("pause");
    return 0;
}
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
22.11.2009, 21:57 5
1)
Написано же - натуральных чисел.
Значит как минимум все циклы должны быть с условиями i>0 j>0 k>0.

2)
Цикл по k очевидно не нужен.
Если известно i, j, то k либо вычисляется, либо не вычисляется в один присест.

3)
Чего-то я нигде не вижу условия x<=y<=z
Значит будет печатать все варианты

Вывод: над кодом еще работать и работать
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.11.2009, 22:29 6
Цитата Сообщение от odip Посмотреть сообщение
3)
Чего-то я нигде не вижу условия x<=y<=z
Значит будет печатать все варианты
Выполнение этого условия заложено в следующих строках:

Цитата Сообщение от TanT Посмотреть сообщение
for (int i=(int)sqrt((double)n); i>=0; i--)
{
z=i;
for (int j=(int)sqrt((double)n-i*i); j>=0; j--)
{
y=j;
for (int k=(int)sqrt((double)n-i*i-j*j); k>=0; k--)
{
x=k;
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
23.11.2009, 03:29 7
Цитата Сообщение от odip Посмотреть сообщение
Вывод: над кодом еще работать и работать
в свете использования кода как примера, замечания не существенны , хотя 1 и 2, справедливы. на ошибочность третьего вам указали
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
23.11.2009, 09:25 8
Выполнение этого условия заложено в следующих строках:
Неверно.

В принципе я правильно сказал - условия нет, поэтому будет считать все варианты.
Но!
Функция вернет true как только найдет первый подходящий вариант.
При этом первый подходящий вариант если он существует будет иметь вид: x<=y<=z.
Это произойдет из-за особенностей выбранного способа перебора всех значений.

Тогда исправлю третье замечение.
Функция будет перебирать все пары x,y,z.
Тогда как достаточно перебирать только пары где верно: x<=y<=z,
что существенно сокращает перебор !!!
Правильный вариант при этом если есть то никуда не денется - все равно будет найден.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
23.11.2009, 09:33 9
Цитата Сообщение от odip Посмотреть сообщение
Функция будет перебирать все пары x,y,z.
Тогда как достаточно перебирать только пары где верно: x<=y<=z,
Не согласен. Функция никогда не будет перебирать пары, которые не удовлетворяют условию x<=y<=z. И это заложено (еще раз повторюсь) в тех строках которые я указал.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
24.11.2009, 21:25 10
2valeriikozlov: Еще раз - функция будет перебирать произвольные тройки x,y,z.
Доказывается это тривиально.
Беру исходный текст, включаю печать x,y,z.
Чтобы долго не ждать - запускаю программу при n=15.
Это значение n не может быть представлено в виде суммы трех квадратов.
Вот программа

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
#include <iostream>
#include <cmath>
 
//  Дано натуральное n.  Указать x,y,z таких натуральных чисел, что n=x2 +y2 +z2  и x<=y<=z . 
 
using namespace std;
 
bool findSummSquare(int n, int & x, int & y, int & z)
{
        if(n<0) return false;
 
        for (int i=(int)sqrt((double)n); i>=0; i--)
        {
                z=i;
                for (int j=(int)sqrt((double)n-i*i); j>=0; j--)
                {
                        y=j;
                        for (int k=(int)sqrt((double)n-i*i-j*j); k>=0; k--)
                        {
                                x=k;
                                cout<<"x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
                                if (n==(x*x+y*y+z*z)) return true;
                        }       // end for (int k
                }       // end for (int j       
        }       // end for (int i
 
        return false;
}       // end  findSummSquare
int main()
{
        int n=0, remains;
        int x, y, z;
        //cout<<"Enter n: "; cin>>n;
        for ( n=15; n<=15; n++ ) {
 
                if(!findSummSquare(n,x,y,z))            cout<<"ERR: "<<n<<endl;
                else
                {
                        cout<<"x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
                        cout<<n<<"="<<x*x<<"+"<<y*y<<"+"<<z*z<<endl;
                }               
                system("pause");
 
        }
        return 0;
}

Вот вывод
Код
x: 1 y: 2 z: 3
x: 0 y: 2 z: 3
x: 2 y: 1 z: 3
x: 1 y: 1 z: 3
x: 0 y: 1 z: 3
x: 2 y: 0 z: 3
x: 1 y: 0 z: 3
x: 0 y: 0 z: 3
x: 1 y: 3 z: 2
x: 0 y: 3 z: 2
x: 2 y: 2 z: 2
x: 1 y: 2 z: 2
x: 0 y: 2 z: 2
x: 3 y: 1 z: 2
x: 2 y: 1 z: 2
x: 1 y: 1 z: 2
x: 0 y: 1 z: 2
x: 3 y: 0 z: 2
x: 2 y: 0 z: 2
x: 1 y: 0 z: 2
x: 0 y: 0 z: 2
x: 2 y: 3 z: 1
x: 1 y: 3 z: 1
x: 0 y: 3 z: 1
x: 3 y: 2 z: 1
x: 2 y: 2 z: 1
x: 1 y: 2 z: 1
x: 0 y: 2 z: 1
x: 3 y: 1 z: 1
x: 2 y: 1 z: 1
x: 1 y: 1 z: 1
x: 0 y: 1 z: 1
x: 3 y: 0 z: 1
x: 2 y: 0 z: 1
x: 1 y: 0 z: 1
x: 0 y: 0 z: 1
x: 2 y: 3 z: 0
x: 1 y: 3 z: 0
x: 0 y: 3 z: 0
x: 3 y: 2 z: 0
x: 2 y: 2 z: 0
x: 1 y: 2 z: 0
x: 0 y: 2 z: 0
x: 3 y: 1 z: 0
x: 2 y: 1 z: 0
x: 1 y: 1 z: 0
x: 0 y: 1 z: 0
x: 3 y: 0 z: 0
x: 2 y: 0 z: 0
x: 1 y: 0 z: 0
x: 0 y: 0 z: 0
ERR: 15
Press any key to continue . . .
Добавлено через 1 минуту
Надеюсь теперь видно что x,y,z достаточно произвольные и условие x<=y<=z не выполняется ?

Добавлено через 5 минут
Для примера - добавлю проверку условия x<=y<=z в код программы.
Вот улучшенная программа

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
#include <iostream>
#include <cmath>
 
//  Дано натуральное n.  Указать x,y,z таких натуральных чисел, что n=x2 +y2 +z2  и x<=y<=z . 
 
using namespace std;
 
bool findSummSquare(int n, int & x, int & y, int & z)
{
        if(n<0) return false;
 
        for (int i=(int)sqrt((double)n); i>=0; i--)
        {
                z=i;
                for (int j=(int)sqrt((double)n-i*i); j>=0; j--)
                {
                        y=j;
                        if ( y>z ) { break; }
                        for (int k=(int)sqrt((double)n-i*i-j*j); k>=0; k--)
                        {
                                x=k;
                                if ( x>y ) { break; }
                                cout<<"x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
                                if (n==(x*x+y*y+z*z)) return true;
                        }       // end for (int k
                }       // end for (int j       
        }       // end for (int i
 
        return false;
}       // end  findSummSquare
int main()
{
        int n=0, remains;
        int x, y, z;
        //cout<<"Enter n: "; cin>>n;
        for ( n=15; n<=15; n++ ) {
 
                if(!findSummSquare(n,x,y,z))            cout<<"ERR: "<<n<<endl;
                else
                {
                        cout<<"x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
                        cout<<n<<"="<<x*x<<"+"<<y*y<<"+"<<z*z<<endl;
                }               
                system("pause");
 
        }
        return 0;
}


Вот новый вывод:
Код
x: 1 y: 2 z: 3
x: 0 y: 2 z: 3
ERR: 15
Press any key to continue . . .
Теперь мы видим, что
1) условие x<=y<=z действительно соблюдается
2) перебор СУЩЕСТВЕННО сократился
2
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.11.2009, 05:51 11
odip, потестировал код, и пришел к выводу, что действительно: условие x<=y<=z соблюдается только в момент вызова функции findSummSquare(), затем это условие нарушается. Короче Вы были правы. Еще раз убедился - истина рождается в споре.
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
25.11.2009, 05:55 12
как никрути задача была решена верно, а за оптимизацию "спасибо"
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
25.11.2009, 08:36 13
условие x<=y<=z соблюдается только в момент вызова функции findSummSquare(), затем это условие нарушается.
Просто ты сделал неверный логический вывод: раз условие выполняется в начале цикла, то оно будет выполняться и далее.

И это не самый оптимальный вариант - можно сделать еще быстрее
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.11.2009, 09:14 14
Цитата Сообщение от odip Посмотреть сообщение
И это не самый оптимальный вариант - можно сделать еще быстрее
Вы имеете ввиду задачу?:
Цитата Сообщение от TanT Посмотреть сообщение
есть решение очень похожей на вашу первую задачу (Дано натуральное n. Указать x,y,z таких натуральных чисел, что n=x^2 +y^2 +z^2 и x<=y<=z .)
Если да, то можно улучшить то что Вы писали:
Цитата Сообщение от odip Посмотреть сообщение
Цикл по k очевидно не нужен.
Если известно i, j, то k либо вычисляется, либо не вычисляется в один присест.
и
Цитата Сообщение от odip Посмотреть сообщение
Написано же - натуральных чисел.
Значит как минимум все циклы должны быть с условиями i>0 j>0 k>0.
Больше вроде ничего, что можно оптимизировать, в таком варианте не вижу.
Может быть лучше получится если начинать с присваивания x, y, z значений 1, а потом увеличивать. Больше вариантов пока не вижу. Или еще есть варианты?
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
25.11.2009, 09:15 15
Цитата Сообщение от odip Посмотреть сообщение
И это не самый оптимальный вариант - можно сделать еще быстрее
а можно увидеть данное решение?
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
25.11.2009, 10:31 16
Или еще есть варианты?
Нет, но этого уже достаточно.
0
25.11.2009, 10:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2009, 10:31
Помогаю со студенческими работами здесь

Тела вращения Builder (или TurboC++)
Здравствуйте, помогите пожалуйста написать программу, выводящую на форму коническую поверхность...

Как правильно настроить DOSBox для работы в TurboC?
Подскажите пожалуйста, как правильно пользоваться досбоксом. Нужно ли каждый раз, чтобы запустить...

Ошибка компиляции многофайлового проекта (cpp и asm) в TurboC
Существует два файла в проекта:.cpp и .asm.При компиляции cpp расширение компилируется без проблем,...

Вывести все номера элементов массива, оканчивающиеся цифрой 0 (TurboC)
Здравствуйте ребята! Скоро сессия. Вот сижу читаю теорию, а как только приступаю к решению задачи...

[TurboC раздельная компиляция] Написать программу, которая заменяет все элементы главной диагонали числами от 1 до n
Нужно написать программу, которая заменяет все элементы главной диагонали числами от 1 до n. Файл...

Построить схемы решения, построить графики решения, сравнить решения с помощью функции ode45
1. Построить схемы решения рассмотренных задач в системе Simulink, получить графики решения. ...


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

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