Существует ли динамический способ разделить 100 на разные значения?

#c# #logic

Вопрос:

Я застрял в сценарии, который мне сложно реализовать. Сценарий таков : у меня есть строки на листе Excel, которые являются динамическими . иногда это может быть 2, иногда 5, иногда 12, что означает, что там может быть любое количество строк. мне нужно присвоить разные уникальные значения каждой доступной строке таким образом, чтобы их сумма была равна 100. Пример : если у меня 2 строки, я могу присвоить значения 65 и 35, но не 50 обоим, так как значение должно быть уникальным. аналогично, если у меня есть 4 строки, мне нужно присвоить значения, такие как 20,30, 27, 23 .Для этого нужен код c#.

Как я могу это сделать?

Комментарии:

1. Ваше «КАК можно скорее» здесь не имеет никакого эффекта, значения или ценности… Тем не менее, вы должны полностью избавиться от своей проблемы с excel и сначала попытаться решить ее с помощью простого кода. Затем, когда вы узнаете, как это решить, вы сможете поработать над его интеграцией

2. ТАК что это не для решения загадок, экзаменационных заданий и конкурсных задач. Что вы пробовали до сих пор? Если вы можете показать какой-то код с определенной проблемой, сообщество может вам помочь.

Ответ №1:

Существует множество способов генерирования различных случайных чисел для каждой строки. То, как я генерировал числа, было с DateTime.Now.Second и DateTime.Now.Minute . Чтобы гарантировать, что число никогда не превысит 100, вы можете вычесть из максимального числа в строке. Вот общая идея: `

    public static ulong CapAtNumber(ulong num, ulong cap) {   
        
    while(num>cap)
        {

            num = (num / 2) - 2;
            if (num < 3)
            {
                num  = (Convert.ToUInt64(DateTime.Now.Minute)   Convert.ToUInt64(DateTime.Now.Second) /  2);
            }
        }
      
        return num;
    }
 

This is an example of how you would find the maximum. I used the Math group to check for maximums among two номера улуна. Числа-это B, C, E, F и так далее, и я группирую их в AB CD EF, чтобы найти максимум между группами. Размер массива каждый раз сокращается вдвое, пока размер массива не составит 1. Если размер массива равен 1, максимальное число в массиве.

 public static ulong[] FindTheMaxOfArray(ulong[] arg)
    {
        bool repeat = true;

        ulong checknumber = 100;
        while(repeat == true)
        {
            if (arg.Length % 2 == 0)
            {
                var halflist = new ulong[arg.Length / 2];
                for (int z = 0; z < arg.Length / 2; z  = 2)
                {
                    
                    halflist[z] = Math.Max(arg[z], arg[z   1]);
                    if (
                        halflist.Length == 1)
                    {
                        repeat = true;
                        arg = new ulong[halflist.Length];
                        arg = halflist; 
                    }
                    else { repeat = false; 
                        checknumber = halflist[0]; }

                }
               
            }
            else
            {
                var halflist = new ulong[arg.Length   1 / 2];
                for (int z = 0; z < halflist.Length; z  )
                {
                    if (z % 2 != 0)
                    {
                        if (z != halflist.Length - 2)
                        {
                            halflist[z] = Convert.ToUInt64(Math.Max(Math.Max(arg[z], arg[z   1]), arg[z   2]));
                        }
                        else { halflist[z] = Convert.ToUInt64(Math.Max(arg[z], arg[z   1])); }

                    }

                }
                if (halflist.Length == 1)
                {
                    repeat = true;
                    arg = new ulong[halflist.Length];
                    arg = halflist;

                }
                
                else { checknumber = halflist[0];
                    repeat = false; 
                }

            }
        }
            
       for(int z=0; z<arg.Length; z  )
        {
            if (arg[z] == checknumber)
            {
                arg[z] = CapAtNumber(arg[z], arg[z] - 20);
            }
        }
        return arg;
    }
 

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

 public static ulong[] Checkforrepeats(ulong[] args)
    {
        ulong repeatednumber = 1000;
        int repeat = -1;
       
        foreach( ulong num in args)
        {
            for(int z = 0; z<args.Length; z  )
            {
                if(z == 0)
                { repeat = -1; }
                if(num ==args[z])
                {
                    repeat  = 1; //repeat was set to -1 to counter act the guaranteed repeat that will happen 

                }
                if (repeat == 2)
                {
                    args[z]  = 2;
                    args[z - 1] -= 2;
                   
                }
            }
        }
        return args;
    }
 

Комментарии:

1. DateTime Элементы нужно немного изменить в зависимости от того, насколько случайным вы хотите, чтобы это было.