Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
 Аватар для olenenok
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 21

Получить все представления числа суммой квадратов целых положительных чисел

08.07.2012, 18:31. Показов 4992. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано целое положительное число N. Получить все представления этого числа суммой квадратов целых положительных чисел. Выдать сообщение, если это невозможно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2012, 18:31
Ответы с готовыми решениями:

Вывести все представления заданного натурального числа суммой натуральных чисел
Задача: Вывести все представления натурального числа N суммой натуральных чисел. Пример: Ввод: 4 Вывод: 1+1+1+1 1+2+1 1+3

Заданы массивы целых чисел X(n) и Y(n). Все числа, с нечётной суммой цифр, переписать в массив Z
Заданы массивы целых чисел X(n) и Y(n) . Все числа, с нечётной суммой цифр, переписать в массив Z . Найти три наибольших простых числа в...

Даны два целых числа А и В (А<В). Найти сумму квадратов всех целых чисел от А до В включительно
Даны два целых числа А и В (А&lt;В). Найти сумму квадратов всех целых чисел от А до В включительно.

33
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
10.07.2012, 21:45
Студворк — интернет-сервис помощи студентам
Нет. Дело не в этом. Я генерировал сочетания без повторений, а надо - сочетания с повторениями.
0
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
10.07.2012, 22:20
Вот мой вариант

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
#include "stdafx.h"
 
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <cctype>
#include <cmath>
#include <vector>
#include <set>
#include <algorithm>
#include <locale>
 
#include <iterator>
 
using namespace std;
 
 
set<multiset<int, less<int>>, less<multiset<int, less<int>>>> result;
 
 
int getInput();
void Task(vector<int> const &, multiset<int, less<int>> const &, int);
void printmSet(multiset<int, less<int>> const &);
 
int _tmain(int argc, _TCHAR* argv[])
{
    locale::global(locale("Russian_Russia.1251"));
    cin.imbue(locale("Russian_Russia.866"));
    cout.imbue(locale("Russian_Russia.1251"));
 
 
    int const N(getInput());
    multiset<int, less<int>> initialMset;
    vector<int> initialVector;
 
    vector<int>::size_type max_size = static_cast<vector<int>::size_type>(floor(sqrt(static_cast<double>(N))));
    for (vector<int>::size_type i = 1; i <= max_size; ++i)
        initialVector.push_back(i * i);
 
    Task(initialVector, initialMset, N);
 
    cout << endl << endl;
    cout << "Список всех разложений" << endl;
    cout << "(с точностью до порядка слагаемых)" << endl;
    cout << "на квадраты данного числа" << endl << endl;
    set<multiset<int, less<int>>, less<multiset<int, less<int>>>>::const_iterator iter;
    for (iter = result.begin(); iter != result.end(); iter++)
        printmSet(*iter);
 
 
 
 
    return 0;
}
 
int getInput()
{
    int n;
    string s;
 
    cout << "Введите целое положительное число, состоящее не более чем из 9 цифр: ";
    getline(cin, s);
    while (true)
    {
        if (s.length() == 0)
        {
            cout << "Число не введено, попробуйте еще раз...";
            getline(cin, s);
            continue;
        }
        else if (s.length() > 9)
        {
            cout << "Слишком длинное, попробуйте еще раз...";
            getline(cin, s);
            continue;
        }
        else
        {
            bool badInput = false;
            for (int i = 0; i < s.length(); ++i)
                if (!isdigit(s[i]))
                {
                    badInput = true;
                    break;
                }
            if (badInput == true)
            {
                cout << "Ошибочный ввод, попробуйте еще раз...";
                getline(cin, s);
                continue;
            }
        }
        n = atoi(s.c_str());
        if (n == 0)
        {
            cout << "Неинтересно, тривильный случай, попробуйте еще раз... ";
            getline(cin, s);
            continue;
        }
        else
            break;
    }
    return n;
}
 
void Task(vector<int> const & curvect, multiset<int, less<int>> const & curmset, int tailnum)
{
    vector<int> workvect(curvect);
    multiset<int, less<int>> workmset(curmset);
 
    switch (tailnum)
    {
        case 0:
            result.insert(workmset);
            return;
        case 1:
            workmset.insert(1);
            result.insert(workmset);
            return;
        case 2:
            workmset.insert(1);
            workmset.insert(1);
            result.insert(workmset);
            return;
        case 3:
            workmset.insert(1);
            workmset.insert(1);
            workmset.insert(1);
            result.insert(workmset);
            return;
        default:
            for (vector<int>::const_reverse_iterator riter = workvect.rbegin(); riter != workvect.rend(); ++riter)
            {
                int newtail = tailnum - *riter;
                int max_size = static_cast<vector<int>::size_type>(floor(sqrt(static_cast<double>(newtail))));
                vector<int> newvect;
                for (vector<int>::size_type i = 1; i <= max_size; ++i)
                    newvect.push_back(i * i);
                multiset<int, less<int>>::iterator iter = workmset.insert(*riter);
                Task(newvect, workmset, newtail);
                workmset.erase(iter);
            }
    }
}
 
void printmSet(multiset<int, less<int>> const & mset)
{
    static int i(1);
    ostream_iterator<int> output (cout, " + ");
    cout << setw(5) << i++ << "." << '\t';
    copy(mset.begin(), mset.end(), output);
    cout << '\b'  << '\b' << " " << endl;
}
0
 Аватар для olenenok
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 21
11.07.2012, 01:04  [ТС]
что-то он слишком замудрённый, да и не работает, ошибки выдаёт. =((

Добавлено через 18 минут
очень срочно нужна прога эта, завтра с утра крайний срок
0
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
11.07.2012, 01:38
Все работает.
Компилятор VS 2010

Создайте консольный проект и туда все скопируйте.
0
 Аватар для olenenok
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 21
11.07.2012, 01:57  [ТС]
0
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
11.07.2012, 08:17
У вас не тот коммпилятор, может быть древний очень.
0
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
11.07.2012, 10:06
автору вопроса известно, что такое динамическое программирование?
0
 Аватар для olenenok
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 21
11.07.2012, 10:29  [ТС]
Цитата Сообщение от ramybozy Посмотреть сообщение
У вас не тот коммпилятор, может быть древний очень.
так надо под эту версию прогу

Добавлено через 28 секунд
Цитата Сообщение от salam Посмотреть сообщение
автору вопроса известно, что такое динамическое программирование?
известно
0
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
11.07.2012, 10:39
приведите, пожалуйста, точное условие задачи.
0
 Аватар для olenenok
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 21
11.07.2012, 10:40  [ТС]
Цитата Сообщение от salam Посмотреть сообщение
приведите, пожалуйста, точное условие задачи.
Дано целое положительное число N. Получить все представления этого числа суммой квадратов целых положительных чисел. Выдать сообщение, если это невозможно.
0
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
11.07.2012, 10:49
меня смущало отсутствие данных о количестве квадратов...
предлагаю Вам рекурсию, простите за бестактность... Вам необходимо написать функцию, которая бы раскладывала данное х на сумму двух квадратов. определив первое разложение(р.1), Вы вызываете процедуру для первого числа разложения и прогоняете ее по всему числу, после - для второго и прогоняете ее по всему числу, после - собираете для двух чисел все это дело... и так далее рекурсивно раскладываете все числа всех предыдущих разложений пока не придете к варианту n 1^2...
0
 Аватар для olenenok
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 21
11.07.2012, 12:45  [ТС]
Цитата Сообщение от salam Посмотреть сообщение
меня смущало отсутствие данных о количестве квадратов...
ну как дали условие, так и есть

Добавлено через 35 минут
Цитата Сообщение от salam Посмотреть сообщение
меня смущало отсутствие данных о количестве квадратов...
предлагаю Вам рекурсию, простите за бестактность... Вам необходимо написать функцию, которая бы раскладывала данное х на сумму двух квадратов. определив первое разложение(р.1), Вы вызываете процедуру для первого числа разложения и прогоняете ее по всему числу, после - для второго и прогоняете ее по всему числу, после - собираете для двух чисел все это дело... и так далее рекурсивно раскладываете все числа всех предыдущих разложений пока не придете к варианту n 1^2...
всё это желательно кодом, а не словами..

Добавлено через 1 час 18 минут
вот работает, но коряво както, как подправить?
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
#include "iostream.h"
#include "math.h"
#include <conio.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int k,i,j,q,n,N,Z;
int *A,*S;
 
cout << "N=";
cin >> N;
 
n=(int)sqrt(N)+1;
 
S=new int[n];
 
for (i=0; i< n; i++) S[i]=i*i;
 
for (k=2; k<=n; k++)
{
 
A=new int[k];
 
for (i=0; i<k; i++) A[i]=i;
 
while (1)
{
 
Z=0;
for (i=0; i<k; i++)
{
j=A[i];
Z=Z+S[j];
}
if (Z == N)
{
q=0;
for (i=0; i<k; i++)
if (S[A[i]]==0)
{
q=-1;
break;
}
if (q == 0)
{
for (i=0; i<k; i++)
cout << S[A[i]] << " ";
cout << endl;
}
}
 
q=0;
 
for (j=k-1; j>=0; j--)
if (A[j] != (n-k+j))
{
q=-1;
A[j]++;
for (i=j+1; i<k; i++) A[i]=A[i-1]+1;
break;
}
if (q == 0){
printf("Nevozmozhno");
getch()  ;
return 0;
}
}
}
 }
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
11.07.2012, 23:15
Цитата Сообщение от Catstail Посмотреть сообщение
Вы сами-то этот код транслировали?
нет конечно, влом как-то компилировать в три часа ночи. Писал на коленке
Цитата Сообщение от Catstail Посмотреть сообщение
Там же ошибки...
какой ужас три описки
Цитата Сообщение от ValeryS Посмотреть сообщение
scanf("%i",%N);
надо
C
1
scanf("%i",&N);
можно
C
1
scanf("%d",&N);
Цитата Сообщение от ValeryS Посмотреть сообщение
N=N-(i-1)*(i-1);
printf("%d",i);
надо
C
1
printf("%d",i-1);
Цитата Сообщение от ValeryS Посмотреть сообщение
printf("%d="N);
надо
C
1
printf("%d=",N);
и одна алгоритмическая при N=1 программа зацикливается
специально не стал писать, чтобы не тупо копировали
ловится отладчиком за пять минут

Добавлено через 2 минуты
Цитата Сообщение от olenenok Посмотреть сообщение
n=(int)sqrt(N)+1;
S=new int[n];
что при 2 будет 2 набора???
я знаю только один 1+1
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
12.07.2012, 00:02
а на N есть ограничения?

Добавлено через 40 минут
если без повторов слагаемых, то вот
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
#include <iostream>
#include <vector>
 
int n, cnt = 0;
std::vector <int> vec, res;
 
void rec(int remain, int idx) { // remain - осталось набрать
    if (!remain) {
        for (int i = 0; i < idx; ++i)
            std::cout << res[i] << " ";
        std::cout << std::endl;
        ++cnt;
    } else {
        for (int i = 0; i < vec.size(); ++i) {
            if (remain - vec[i] >= 0) {
                if ((idx && res[idx - 1] < vec[i]) || (!idx)) {
                    res[idx] = vec[i];
                    rec(remain - vec[i], idx + 1);
                }
            }
        }
    }
}
 
int main() {
    std::cin >> n;
    for (int i = 2; i * i <= n; ++i)
        vec.push_back(i * i);
 
    res.resize(n);
    rec(n, 0);
    if (!cnt)
        std::cout << "not";
    return 0;
}
Добавлено через 55 секунд
если с повторами, то в 16 строке <= поставить нужно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2012, 00:02

Найти количество квадратов в наборе из 10 целых положительных чисел
Описать функцию IsSquare(K) логического типа, возвращающую True, если целый параметр K (&gt; 0) является квадратом некоторого целого числа,...

Вывести таблицу квадратов первых десяти целых положительных чисел
Написать программу, которая выводит таблицу квадратов первых десяти целых положительных чисел.

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

Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел
Помогите пожалуйста с программой. Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел

Написать программу, которая выводит таблицу квадратов первых десяти целых положительных чисел
Ребят, выручайте) Написать программу, которая выводит таблицу квадратов первых десяти целых положительных чисел: числа квадрат 1...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru