Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2009, 20:36   #1
prasvit
 
Регистрация: 04.02.2009
Сообщений: 4
По умолчанию создать массив сл значений, сумма которых определена

Помогите, пожалуйста, с такой задачей. Нужно создать массив, к примеру 20 значений, заполненный случайнымми числами, с выполнением условия, чтоб сумма элементов была равна 1200. массив не может содержать нули, значения могут повторяться. Как создать массив и заполнить я знаю, подскажите хотя бы алноритм
prasvit вне форума Ответить с цитированием
Старый 02.04.2009, 20:41   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

prasvit, ну например:
Забиваете массив случайными числами. Далее, если сумма = 1200, то все в порядке. Иначе, ищем разность между 1200 и (суммой-последний элемент) и присваиваем ее последнему элементу. Как-то так. Можно менять случайный элемент.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.04.2009, 20:44   #3
prasvit
 
Регистрация: 04.02.2009
Сообщений: 4
По умолчанию

нет, недопустимы, и нулей тоже не должно быть

причем, если первый элемент выдало сразу 1200, то остальные элементы будут нулями, а это потеря потерь

Последний раз редактировалось Stilet; 03.04.2009 в 10:03.
prasvit вне форума Ответить с цитированием
Старый 02.04.2009, 20:51   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

Цитата:
причем, если первый элемент выдало сразу 1200, то остальные элементы будут нулями
Ну как раз такую ситуацию несложно исключить - брать верхний предел для генерации меньше 1200.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.04.2009, 21:37   #5
alexov
Пользователь
 
Регистрация: 31.10.2008
Сообщений: 61
По умолчанию

Код:
#include <iostream>
#include <time.h>
using namespace std;

int main()
{
	const int n=20;
	int a[n];
    int sum=0;
	srand(time(0));
	for(int i=0; i<n; i++)
		a[i]=rand()%200;
	
	while(sum!=1200)
	{
		sum=0;
		for(int i=0; i<n; i++)
			a[i]=rand()%200;
		for(int i=0; i<n; i++)
		sum+=a[i];
		if(sum==1200)
		{
			for(int i=0; i<n; i++)
				cout<<a[i]<<" ";
			break;
		}
	}
	system("pause");
}
Но как с нулем!?
!Help Win Api!
alexov вне форума Ответить с цитированием
Старый 02.04.2009, 21:40   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от alexov
Но как с нулем!?
Так просто:
Код:
a[i]=rand()%200+1;
и не будет нуля )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 03.04.2009, 03:39   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Задача классная, сделал в Ворде генератор.
Если кнопку вам не видно (кнопка сине-красная), то выберите сначала пункт Надстройки (это для Word 2007 и выше), обычно он вверху справа.
Кнопка со знаком суммы (большая сигма) даёт возможность убедиться, что вычисленный ряд имеет заданную вами сумму.
Код:
Dim arrArray() As Long, N As Variant
Const ConstSumma = 1200

Sub iMakeSeries(): Dim i As Integer
'собирает и печатает ряд из N натуральных чисел, с постоянной суммой ряда'
If N = Empty Then N = 2

N = InputBox("Сколько будет чисел в ряду?", "iMakeSeries", N)
If N < 1 Or Not IsNumeric(N) Then Exit Sub

If N > 0 Then
    If N > ConstSumma / 2 Then MsgBox "Ряд с заданной суммой (" & _
    ConstSumma & ") состоит в основном из единиц либо невозможен."
    If N > ConstSumma Then MsgBox "Составить ряд с заданной суммой (" & _
    ConstSumma & ")" & vbCr & " из натуральных чисел невозможно.": Exit Sub
End If

ReDim arrArray(N - 1) As Long   'целочисленный массив с индексами от 0 до N-1'
arrArray(N - 1) = LastMember

With Selection
    .TypeParagraph
    For i = 0 To UBound(arrArray): .TypeText vbTab & arrArray(i): Next
    .TypeParagraph
End With
End Sub


Function LastMember() As Long: Dim CurrentSumma As Long, k As Integer

While k < N - 1
    Randomize
    arrArray(k) = Abs(1 + Fix((ConstSumma - CurrentSumma) / Sqr(N * (k + 1)) * Rnd))
    '"выкрутасы" с N и k - это попытка избежать генерации чисел, близких к общей сумме'
    CurrentSumma = CurrentSumma + arrArray(k)
    k = k + 1
Wend

LastMember = ConstSumma - CurrentSumma      'член ряда, "подбивающий" общую сумму'
If LastMember < 1 Then MsgBox "Неудача. Перезапустите меня!"
End Function
Генератор можно запускать по альт-F8 или альт-F11 и затем F8. И менять сумму — там же, в среде ВБА.

Как выяснилось, независимо от «модели» Word, кнопки, созданные для запуска программ в моём Ворде (2003), далеко не у всех открываются их Вордами. Так что остаётся либо плюнуть и уйти, либо жать альт-F8. Либо что-то там потыкать — см. пост Sazary на с. 3.
Вложения
Тип файла: doc Generator.doc (41.0 Кб, 14 просмотров)

Последний раз редактировалось Sasha_Smirnov; 04.04.2009 в 03:38.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 04.04.2009, 01:36   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov
alexov, а какие у вас ряды получаются, экзешник (или листинг) не приложите? (А то у меня компилятора нет.)
Скомпилил вариант alexov (с указанной поправкой).

ps Не подскажете, как увидеть кнопку в 2003 word'е? )
Вложения
Тип файла: rar 1200.rar (114.3 Кб, 13 просмотров)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 04.04.2009, 02:18   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Вот чёрт, с этими кнопками вся загвоздка! Программа есть — а что толку, если её не выполнить.

Попробуйте сориентироваться, гляда в мой вот этот пост.

Но в любом случае альт-F8 должно (если не включена защита от макросов) открывать список надстроек документа. И из него можно выполнить.

У меня же, главное, Word 2003. Все кнопки сверху на "сером веществе"! За компиляцию спасибо!

Последний раз редактировалось Sasha_Smirnov; 04.04.2009 в 02:21.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 04.04.2009, 02:33   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Sasha_Smirnov, с кнопками так и не получилось.. Ну да ладно. В принципе, вызов через Alt+F8 не должен доставлять каких-то неудобств. )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать вектор Х из тех элементов вектора А, сумма цифр которых в десятичной записи больше заданного Dimati87 Помощь студентам 1 06.03.2009 14:36
СУММА ЗНАЧЕНИЙ ЭЛЕМЕНТОВ Dimak24 Помощь студентам 1 24.12.2008 09:29
сумма всех начальных членов ряда, значение которых не меньше заданного числа e, 0<e<1 Арчи Помощь студентам 2 20.12.2008 12:39
Создать массив только из тех элементов, у которых остаток от деления на М равен L (0<=L<=M-1) Айвенго Microsoft Office Excel 2 12.01.2008 16:28
определение функции, которая находит кол-во столбцов, сумма в которых больше средне арифметич Sandwich Помощь студентам 11 29.10.2007 12:24