Вычесть число из массива

У меня есть программа, которая использует массив, который выглядит так:

1,2,3,4,5

У меня есть число «10», и я хочу вычесть это число из массива.

Это трудно объяснить, но я использую несколько элементов массива в этом вычитании. Это должно было произойти:

   10 - 5 = 5 (array looks now like this => 1,2,3,4)
   5  - 4 = 1 (array looks now like this => 1,2,3)
   3  - 1 = 2 (array looks now like this => 1,2,2)

Итак, как резюме:

это: 1,2,3,4,5 минус 10 даст мне 1,2,2

Но как мне это сделать? Язык программирования C#

РЕДАКТИРОВАТЬ :

ввод =

1 . Массив с 5 целыми числами в качестве элементов: 1, 2, 3, 4 и 5 2 . Число 10 (целое)

процесс =

  1. Из последнего значения вычитается 10, а затем полученное число вычитается из следующего элемента массива до тех пор, пока от «10» не останется ничего.

выход =

вместо 1,2,3,4,5 => 1,2,2 (запятая разделяет элементы в массиве)


person Community    schedule 05.08.2013    source источник
comment
Я не понимаю вопроса :-s и не могу понять, почему массивы == что они делают после операции   -  person Nicholas King    schedule 05.08.2013
comment
Вы должны перейти от последнего индекса к первому и удалить/изменить каждое значение   -  person mcont    schedule 05.08.2013
comment
поэтому, чтобы зациклиться с последнего индекса,... должен ли я использовать цикл for следующим образом: for(int i==5;i=0;i--){;} ?   -  person    schedule 05.08.2013
comment
Вы имеете в виду, что есть один массив с 10 элементами. И когда вычитается 5, у него будут только значения меньше полученного результата?   -  person Nisarg Shah    schedule 05.08.2013
comment
да, но в вопросе я использую ',' для разделения разных значений в массиве, а 10 - целое число   -  person    schedule 05.08.2013
comment
Не могли бы вы указать все значения массива и фактический результат? Так что вопрос может стать более понятным.   -  person Nisarg Shah    schedule 05.08.2013
comment
ок - см. вопрос ; я отредактировал...   -  person    schedule 05.08.2013


Ответы (2)


Вы имеете в виду что-то вроде этого:

public static int[] Subtract(int[] array, int value) {
  if (Object.ReferenceEquals(null, array))
    throw new ArgumentNullException("array");

  if (value < 0) 
    return Addition(array, -value);

  int s = 0;

  int index = 0;
  int delta = 0;

  for (int i = array.GetLength(0) - 1; i >= 0; --i) {
    s += array[i];

    if (s > value) {
      index = i;
      delta = s - value;

      break;
    }
  }

  // Too big a value is subtracted, let's return an empty array
  if ((index <= 0) && (delta <= 0)) // <- (delta <= 0) to prevent [x, ... z, 0] answers
    return new int[0];

  int[] result = new int[index + 1];

  for (int i = 0; i < index; ++i)
    result[i] = array[i];

  result[index] = delta;

  return result;
}

// Maximum possible electrons within orbital; 0 - s1, 1 - s1, 2 - p1, 3 - s2 etc.
// Double arithmetic progression's here (main quantum number - level, orbital quantum number - s, p, d...)
private static int MaxElectronsCount(int value) {
  Double n = (-1 + Math.Sqrt(1 + 8.0 * (value + 1))) / 2;

  int group = (int)(n + 1.0 - 1.0e-8); // <- round up to high limit
  int shift = group - (group * (group + 1) / 2 - value);

  return 2 + shift * 4;
}

// Electrons addition 
public static int[] Addition(int[] array, int value) {
  if (Object.ReferenceEquals(null, array))
    throw new ArgumentNullException("array");

  if (value < 0)
    return Subtraction(array, -value);

  List<int> result = new List<int>();

  for (int i = 0; i < array.GetLength(0); ++i)
    result.Add(array[i]);

  int level = 0;

  while (value > 0) {
    if (result.Count <= level)
      result.Add(0);

    int max = MaxElectronsCount(level);
    int delta = max - result[level];

    if (delta > value)
      delta = value;

    if (delta > 0) {
      result[level] = result[level] + delta;
      value -= delta;
    }

    level += 1;
  }

  return result.ToArray();
}
....  

int[] test1 = Subtract(new int[] { 1, 2, 3, 4, 5 }, 1); // <- [1, 2, 3, 4, 4] 
int[] test2 = Subtract(new int[] { 1, 2, 3, 4, 5 }, 5); // <- [1, 2, 3, 4] 
int[] test3 = Subtract(new int[] { 1, 2, 3, 4, 5 }, 6); // <- [1, 2, 3, 3] 
int[] test4 = Subtract(new int[] { 1, 2, 3, 4, 5 }, 10); // <- [1, 2, 2]
int[] test5 = Subtract(new int[] { 1, 2, 3, 4, 5 }, 1000); // <- [] 
int[] test6 = Subtract(new int[] { 1, 2, 3, 4, 5 }, -1); // <- [2, 2, 3, 4, 5]
int[] test7 = Subtract(new int[] { 2, 2 }, 2); // <- [2]

int[] test8 = Addition(new int[] {2, 1}, 16); // <- [2, 2, 6, 2, 6, 1]
person Dmitry Bychenko    schedule 05.08.2013
comment
ок - попробовал; он работает нормально, но когда у меня есть массив ({2,2}), он возвращает 0, когда я вычитаю «2». Как я могу это исправить? - person ; 07.08.2013
comment
и не могли бы вы также привести пример того, как складывать в массив (вместо вычитания)? - person ; 08.08.2013
comment
Сложение в отличие от вычитания, ИМХО, может быть очень простым (см. Мое редактирование), одним словом Сложение (массив, значение) = Вычитание (массив, -значение); - person Dmitry Bychenko; 08.08.2013
comment
хорошо - и что бы я сделал, если бы были определенные правила для сложения (я пытаюсь смоделировать добавление электронов в электронную конфигурацию), потому что я не хочу использовать слишком много операторов if/else - person ; 08.08.2013
comment
например, первый элемент может содержать максимально 2 значения, 2nd= 2,3rd = 6,4th = 2;5th = 6;..... (s,p,d,f,..орбитали) - person ; 08.08.2013
comment
Не могли бы вы четко указать правила и положения? Просто в форме n-й элемент массива (n отсчитывается от нуля) может быть не более чем f(n). Что такое ф(н)? - person Dmitry Bychenko; 08.08.2013
comment
хорошо - вот переменные с установленными значениями для каждого типа: s=2 p=6 d=10 f=14 и порядок в массиве: sspspdspdfspdfspdfs - person ; 08.08.2013
comment
и d-орбиталь заполняется только тогда, когда заполняется s-орбиталь с более высокого уровня, а f-орбиталь заполняется только тогда, когда заполняются s и (один элемент в d) из 2 более высоких уровней... - person ; 08.08.2013
comment
Что ж, формулы f(n) нет, как я и просил; Хорошо, я сделал это для вас - MaxElectronsCount - (провел год в лаборатории электрохимии). Смотрите мою правку. К вашему сведению: есть некоторые исключения из правила s2p..(Cr, например), где S-уровень имеет только 1 электрон, а P-уровни не пусты. - person Dmitry Bychenko; 08.08.2013
comment
это абсолютно здорово! :) также спасибо за упоминание об исключениях с Chromium/... но они не применимы в этой ситуации. большое спасибо! - person ; 08.08.2013
comment
Не могли бы вы переписать код, чтобы он добавлял сначала к 4s, а затем к 3d? (также: сначала 6 с, затем 3f и далее). Потому что я использую метод «заполнения» с использованием периодической таблицы (где блоки d и f выше, но имеют более низкие энергетические уровни) - person ; 09.08.2013
comment
извините, если я прошу вас слишком много; но не могли бы вы хотя бы просто дать мне представление о том, как я могу сделать это быстрее (без / с меньшим использованием операторов if? - person ; 09.08.2013
comment
Формально сформулируйте проблему (с самого начала и до самого конца). Инкрементальный дизайн здесь — путь в никуда. Подумайте, что вы хотите иметь: всего две функции на массиве или, скажем, класс ElectronConfiguration? В последней конкретной проблеме самым простым решением является кодирование еще одной функции (например, MaxElectronsCount, которую я сделал), которая возвращает уровень, который будет заполнен следующим. - person Dmitry Bychenko; 09.08.2013
comment
хорошо: я изменил порядок заполнения электронами (теперь он: [ sspspsdpsdps(d^1)f(d продолжает заполняться до 10)ps(d^1)f(d продолжает заполняться)p ], потому что Мне нужно добавить электроны для заполнения в соответствии с орбитальными блоками периодической таблицы ... также есть исключение: где я написал (d ^ 1), только 1 электрон может быть добавлен к d-орбитали (например, лантана) и затем он продолжает добавлять электроны на f-орбиталь (продолжение в следующем комментарии...) - person ; 10.08.2013
comment
Когда f-орбиталь заполнена, она продолжит заполнять эту незавершенную d-орбиталь, а затем продолжит нормальное заполнение следующей p-орбитали... (это также происходит во второй раз). Должно быть 2 функции: одна, которая может складывать электроны, и другая, которая вычитает электроны. (очень важно снова следовать исключениям, которые я указал ранее). - person ; 10.08.2013
comment
Функции не должны быть в классе. - person ; 12.08.2013
comment
пожалуйста, помогите мне, я не обученный профессионал, и когда я пытаюсь написать код для сложных операций, списки кода очень длинные (с использованием циклов и операторов if), не могли бы вы создать эти две функции для меня? - person ; 12.08.2013

Я не уверен, понял ли я вас, но попробуйте следующее:

private void SubstractNumberFromArray(List<int> array, int number)
{
    //array.Sort();
    for (int i = array.Count - 1; i >= 0; i--)
    {
        int toSubstract = Math.Min(number, array[i]);
        array[i] -= toSubstract;
        if (array[i] == 0)
            array.RemoveAt(i);
        number -= toSubstract;

        if (number == 0)
            break;
    }

    if (number != 0)
        throw new Exception("Can't substract!");

}
person Yozer    schedule 05.08.2013