Разделить число на неравные части

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
Доброго времени суток!
Допустим есть число 10. Его нужно разделись на 5 неравных частей. То есть при обычном делении получится 2. А мне нужно получить что-то вроде: 2+1+4+2+1=10. Возможно есть метод в c# для данной операции?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 609
Благодарностей
4 601
Баллы
113
конечно возможно. Придумай алгоритм и реализуй его или попроси кого-то реализовать
 
  • Спасибо
Реакции: arhip1985

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
самое простое - определить какие это должны быть неравные части, например 10% 20% 40% 12% и 18% . Потом первые четыре числа вычисляешь по процентам с округлением до целого, но чтобы не было равно не одному из предыдущего, а последнее которое типа 18% - вычесляешь вычитанием суммы всех предыдущих из общего числа... такой алгоритм может давать сбои - но как намётка - пример - подойдёт
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
а где это надо? боюсь спросить..
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 167
Благодарностей
2 168
Баллы
113
10. Его нужно разделись на 5 неравных частей
.... А мне нужно получить что-то вроде: 2+1+4+2+1=10
Одного меня смутило что в примере результата есть две пары равных частей?
 

kermyt

Новичок
Регистрация
14.10.2017
Сообщения
3
Благодарностей
3
Баллы
3
алгоритм прост - получаешь рандомом четыре числа из твоего диапазона и по ним получаешь нужные тебе числа в итоге. реализацию могу чутка попозже скинуть, но там простейшее решение
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
алгоритм прост - получаешь рандомом четыре числа из твоего диапазона и по ним получаешь нужные тебе числа в итоге. реализацию могу чутка попозже скинуть, но там простейшее решение
интересно будет посмотреть - как у вас рандомные числа, всегда в сумме будет заданное число
 

kermyt

Новичок
Регистрация
14.10.2017
Сообщения
3
Благодарностей
3
Баллы
3
интересно будет посмотреть - как у вас рандомные числа, всегда в сумме будет заданное число
четыре числа дадут пять диапазонов, которые в сумме и будут нужным числом.

к примеру число 10.
случайные числа 3, 5,7 и 9
получаем пять диапазонов: 1-3, 4-5, 6-7, 8-9, и 10 , т.е. числа: 3+2+2+2+1
с большим числом и диапазоны буду более разные.
на ЯС или на РНР за две минуты написать могу, а вот про с# только вчера узнал, так что денек надо разобраться с синтаксисом
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
я не понял пока верхний способ, но мне кажется самый верный вариант - это перебор, т.е. генерим числа от 1 до х=заданное число - сумма пяти чисел, потом прибавляем каждое с каждым максимум пять раз - все возможные варианты - и уже из вариантов - где сумма равна х = 10 в нашем случае - рандомно выбираем вариант - это вариант - когда каждое число из последовательности должно быть уникальным
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 103
Баллы
113
Может кто-то ещё предложит свой вариант (хотелось бы посмотреть), я решил как-то так
C#:
int num = int.Parse(project.Variables["num"].Value); // число, которое нужно разделить
int numParts = int.Parse(project.Variables["numParts"].Value); // количество частей

Random rnd = new Random();
List<int> listNums = new List<int>();
int numMin;

for (int i = 0; i < numParts - 1; i++) {
    numMin = (int)((num - rnd.Next(num)) / rnd.Next(1, 6));
    num = num - numMin;
    listNums.Add(numMin);
}
listNums.Add(num);
return string.Join("+", listNums);
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Может кто-то ещё предложит свой вариант (хотелось бы посмотреть), я решил как-то так
C#:
int num = int.Parse(project.Variables["num"].Value); // число, которое нужно разделить
int numParts = int.Parse(project.Variables["numParts"].Value); // количество частей

Random rnd = new Random();
List<int> listNums = new List<int>();
int numMin;

for (int i = 0; i < numParts - 1; i++) {
    numMin = (int)((num - rnd.Next(num)) / rnd.Next(1, 6));
    num = num - numMin;
    listNums.Add(numMin);
}
listNums.Add(num);
return string.Join("+", listNums);
прикольно, но в твоём коде (num - rnd.Next(num)) может вернуть 0
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 103
Баллы
113

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 103
Баллы
113

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
Может кто-то ещё предложит свой вариант (хотелось бы посмотреть), я решил как-то так
C#:
int num = int.Parse(project.Variables["num"].Value); // число, которое нужно разделить
int numParts = int.Parse(project.Variables["numParts"].Value); // количество частей

Random rnd = new Random();
List<int> listNums = new List<int>();
int numMin;

for (int i = 0; i < numParts - 1; i++) {
    numMin = (int)((num - rnd.Next(num)) / rnd.Next(1, 6));
    num = num - numMin;
    listNums.Add(numMin);
}
listNums.Add(num);
return string.Join("+", listNums);
Спасибо!! Это в принципе то, что нужно, а можно как нибудь поменять этот код, что бы в результатах были любые числа >0?
 

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
Может кто-то ещё предложит свой вариант (хотелось бы посмотреть), я решил как-то так
C#:
int num = int.Parse(project.Variables["num"].Value); // число, которое нужно разделить
int numParts = int.Parse(project.Variables["numParts"].Value); // количество частей

Random rnd = new Random();
List<int> listNums = new List<int>();
int numMin;

for (int i = 0; i < numParts - 1; i++) {
    numMin = (int)((num - rnd.Next(num)) / rnd.Next(1, 6));
    num = num - numMin;
    listNums.Add(numMin);
}
listNums.Add(num);
return string.Join("+", listNums);
Я только до таких костылей додумался, которые все равно не работают :D
Код:
var sourceList = project.Lists["Список 1"]; //список куда складывать результат
Random rand = new Random(); //рандом
int n = rand.Next(1, int.Parse(project.Variables["Number"].Value)); //на сколько рандомных чисел разделить исходное число
if(n == 1) //если n=1, то возвращаю в список значение равное исходному числу
{
    sourceList.Add(project.Variables["Number"].Value);
    return "n=1";
}
else //если n!=1, то создаю цикл, при котором в список возвращаю n рандомных чисел k из диапазона
{
    int sum = 0;
    while (sum!=int.Parse(project.Variables["Number"].Value)) //цикл завершается если сумма  n-рандомных чисел равна начальному числу
    { 
        sourceList.Clear(); //очищаю список перед началом каждой итерации
    for (int i = 0; i < n; i++)
        {
           int k = rand.Next(1, int.Parse(project.Variables["Number"].Value));
           sourceList.Add(k.ToString());  //получаю число и складываю в список
         }
//суммирую список из полученных чисел
        for(int p = 0; p < sourceList.Count; p++)
           { 
              int t = int.Parse(sourceList[p]);
              sum = sum + t;
           }
    }
}
Цикл просто бесконечный и ProjectMaker виснет, но я совсем недавно начал с кодами разбираться и пока вообще полный ноль в этом:( Прикрепил файл, в котором видно как у меня сейчас работает все, но это явно не правильно :D
 

Вложения

  • 18,6 КБ Просмотры: 220

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 103
Баллы
113
Спасибо!! Это в принципе то, что нужно, а можно как нибудь поменять этот код, что бы в результатах были любые числа >0?
C#:
int num = int.Parse(project.Variables["num"].Value);
int numParts = int.Parse(project.Variables["numParts"].Value);

Random rnd = new Random();
List<int> listNums = new List<int>();
int numRnd;
numParts--;

while (numParts > 0) {
    numRnd = rnd.Next(1, num + 1 - numParts);
    num = num - numRnd;
    numParts--;
    listNums.Add(numRnd);
}
listNums.Add(num);
//listNums.Shuffle(); // перемешивание полученных чисел (если потребуется)
return string.Join("+", listNums);
а где это надо? боюсь спросить..
Тоже интересно))
 

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
C#:
int num = int.Parse(project.Variables["num"].Value);
int numParts = int.Parse(project.Variables["numParts"].Value);

Random rnd = new Random();
List<int> listNums = new List<int>();
int numRnd;
numParts--;

while (numParts > 0) {
    numRnd = rnd.Next(1, num + 1 - numParts);
    num = num - numRnd;
    numParts--;
    listNums.Add(numRnd);
}
listNums.Add(num);
//listNums.Shuffle(); // перемешивание полученных чисел (если потребуется)
return string.Join("+", listNums);
Тоже интересно))
Спасибо! Это то, что нужно! Мотивирует учить код...
Насчет где это нужно, допустим нужно загрузить на один ресурс 10 фотографий в течении 5ти дней и сделать это максимально рандомно, но заранее знать в какой день сколько фотографий заливать. Может есть и решения по проще, но это первое, что в голову пришло да и честно говоря мне просто интересно стало как подобное можно осуществить :dz:
 
  • Спасибо
Реакции: Dimionix

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
в том коде, когда выпадает ноль, то код
for (int i = 0; i < numParts - 1; i++) {
numMin = (int)((num - rnd.Next(num)) / rnd.Next(1, 6));
num = num - numMin;
listNums.Add(numMin);
}
будет так
numMin=0
num = num
listNums.Add(0); - запишет ноль
так же этот алгоритм не гарантирует, что все числа будут не равны друг другу 1 или более раз, но если автору это не важно, то особой разницы и нет (у него условие чтоб были не равны, а в примере из условия есть такие что равны) видимо просто ты ориентировался на это "2+1+4+2+1=10" , а я на это "Его нужно разделись на 5 неравных частей"
 

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
в том коде, когда выпадает ноль, то код
for (int i = 0; i < numParts - 1; i++) {
numMin = (int)((num - rnd.Next(num)) / rnd.Next(1, 6));
num = num - numMin;
listNums.Add(numMin);
}
будет так
numMin=0
num = num
listNums.Add(0); - запишет ноль
так же этот алгоритм не гарантирует, что все числа будут не равны друг другу 1 или более раз, но если автору это не важно, то особой разницы и нет (у него условие чтоб были не равны, а в примере из условия есть такие что равны) видимо просто ты ориентировался на это "2+1+4+2+1=10" , а я на это "Его нужно разделись на 5 неравных частей"
Это я изначально неверно выразился. Я имел ввиду, что сумма не должна быть такая: 2+2+2+2+2=10. Мне важно что бы части были рандомные и в сумме давали исходное число, но повторяться они могут.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 103
Баллы
113
так же этот алгоритм не гарантирует, что все числа будут не равны друг другу 1 или более раз, но если автору это не важно, то особой разницы и нет (у него условие чтоб были не равны, а в примере из условия есть такие что равны) видимо просто ты ориентировался на это "2+1+4+2+1=10" , а я на это "Его нужно разделись на 5 неравных частей"
Можешь показать пример из пяти разных целых чисел, исключая ноль, чтоб в сумме они составили 10?))
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Можешь показать пример из пяти разных целых чисел, исключая ноль, чтоб в сумме они составили 10?))
так в том то и дело)) я ж не конкретно про 10-ку думал - а вообще про любое число, которое можно собрать просуммировав пять разных чисел)) я решил что товарищ правильно поставил условие и неправильно написал пример- на скорую руку так сказать
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)