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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Sekmegalife
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 11
#1

2 решения на turboC - C++

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

1. Данно натуральное n. можно ли представить его в виде суммы трех квадратов натуральных чисел, если можно,то указать все представления n в виде суммы квадратов трех натуральных чисел...
2. Данны натуральные числа n и m. Получить все меньшие n натуральные числа, сумма кубов цифр которых равна м...
Заранее всм спасибо...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2009, 19:26     2 решения на turboC
Посмотрите здесь:

Windows 7 и TurboC - C++
У меня Windows 7 домашняя расширенная х64. Мне нужен TurboC для написания прог по архитектуре, но он здесь не запускается(токо на х86)....

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

Решения матриц - C++
Уважаемые программисты прошу Вас помочь разобраться в решении 2-х задач. 1) Дана действительная матрица размера 6x9. Найти среднее...

Оптимизация решения. - C++
всем привет. решил задачу - #include <iostream> #include <fstream> void print (const int *MAS, const char *, const int,...

есть решения??? - C++
Валя и Вера собрались варить варенье из А кг смородины. По рецепту на 2 кг ягод нужно 3 кг сахара. Валя сказала, что им потребуется С кг...

Решения уравнения - C++
1. (a+b)^2-(a^2+2ab)/a^2 b^2 +4ab^3 +b^4 при a=100 и b=0.001 2. (a+b)^3-(a^3)/3ab^2+b^3+3a^2 b при a=1000 и b=0,0001 ...

Метод решения - C++
С помощью какого метода лучше всего решить на C++ систему уравнений как на картинке ?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
22.11.2009, 19:51     2 решения на turboC #2
есть решение очень похожей на вашу первую задачу (Дано натуральное n. Указать x,y,z таких натуральных чисел, что n=x^2 +y^2 +z^2 и x<=y<=z .) но оно на С++, если разберётесь выложу
Sekmegalife
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 11
22.11.2009, 19:52  [ТС]     2 решения на turboC #3
сбросьте, посмотрю...
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
22.11.2009, 19:55     2 решения на turboC #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;
}
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
22.11.2009, 21:57     2 решения на turboC #5
1)
Написано же - натуральных чисел.
Значит как минимум все циклы должны быть с условиями i>0 j>0 k>0.

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

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

Вывод: над кодом еще работать и работать
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
22.11.2009, 22:29     2 решения на turboC #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;
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
23.11.2009, 03:29     2 решения на turboC #7
Цитата Сообщение от odip Посмотреть сообщение
Вывод: над кодом еще работать и работать
в свете использования кода как примера, замечания не существенны , хотя 1 и 2, справедливы. на ошибочность третьего вам указали
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
23.11.2009, 09:25     2 решения на turboC #8
Выполнение этого условия заложено в следующих строках:
Неверно.

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

Тогда исправлю третье замечение.
Функция будет перебирать все пары x,y,z.
Тогда как достаточно перебирать только пары где верно: x<=y<=z,
что существенно сокращает перебор !!!
Правильный вариант при этом если есть то никуда не денется - все равно будет найден.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
23.11.2009, 09:33     2 решения на turboC #9
Цитата Сообщение от odip Посмотреть сообщение
Функция будет перебирать все пары x,y,z.
Тогда как достаточно перебирать только пары где верно: x<=y<=z,
Не согласен. Функция никогда не будет перебирать пары, которые не удовлетворяют условию x<=y<=z. И это заложено (еще раз повторюсь) в тех строках которые я указал.
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
24.11.2009, 21:25     2 решения на turboC #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) перебор СУЩЕСТВЕННО сократился
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.11.2009, 05:51     2 решения на turboC #11
odip, потестировал код, и пришел к выводу, что действительно: условие x<=y<=z соблюдается только в момент вызова функции findSummSquare(), затем это условие нарушается. Короче Вы были правы. Еще раз убедился - истина рождается в споре.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
25.11.2009, 05:55     2 решения на turboC #12
как никрути задача была решена верно, а за оптимизацию "спасибо"
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
25.11.2009, 08:36     2 решения на turboC #13
условие x<=y<=z соблюдается только в момент вызова функции findSummSquare(), затем это условие нарушается.
Просто ты сделал неверный логический вывод: раз условие выполняется в начале цикла, то оно будет выполняться и далее.

И это не самый оптимальный вариант - можно сделать еще быстрее
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.11.2009, 09:14     2 решения на turboC #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, а потом увеличивать. Больше вариантов пока не вижу. Или еще есть варианты?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2009, 09:15     2 решения на turboC
Еще ссылки по теме:

Улучшение решения... - C++
Я тут решил задачку... Решение не оптимальное... Помогите улучшить... Вот задача: Несчастливые номера (Время: 1 сек. Память: 16 Мб) ...

Решения по Дейтелам - C++
Ребят, такой вопрос, купил книгу Deitel H.M., Deitel P.J. / Дейтел Х.М., Дейтел П.Дж. - Как программировать на С++, очень много заданий,...

Составить программу решения - C++
Даны положительные действительные числа a, x,  (в программе дать имя eps). В последовательности y0, y1, y2,..., образованной по закону: ...

Решения на С с использованием указателей - C++
Поиогите пожалуйсто с решением одной задачки,очень надо.Сама в С ничего не понимаю:sorry: Дан массив координат 30 точек на...

Рекурсивный способ решения - C++
Вычислить y = x^n по следующему правилу: y = ( x^(n/2))^2, если n четное и y = x *y^(n–1), если n нечетное.


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

Или воспользуйтесь поиском по форуму:
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
25.11.2009, 09:15     2 решения на turboC #15
Цитата Сообщение от odip Посмотреть сообщение
И это не самый оптимальный вариант - можно сделать еще быстрее
а можно увидеть данное решение?
Yandex
Объявления
25.11.2009, 09:15     2 решения на turboC
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru