Выбор значения по умолчанию Перечислимого типа, не имея необходимость изменять значения

Я сделал это до сих пор, который охватывает первые два шага, которые я намеревался сделать. Последний шаг мне неизвестен, но у меня есть решение и для этого.

Это мой код:

<script type="text/javascript">
  function getDivisors(n){
    var divisors=new Array();

    for(var x=1;x<n;x++){
      if(n%x==0) divisors.push(x);
    }
    return divisors;
  }


  function getNumbers(n){
    var numbers=new Array(),
    sum=0;

    for(var x=1;x<=n;x++){
      sum=getDivisors(x).reduce((a, b) => a + b, 0);
      if(sum>x) numbers.push(x);
      // console.log("Number: "+x+" sum:"+sum);
    }
    return numbers;
  }

  var remainingNumbers = getNumbers(1000);
  console.log(remainingNumbers);

</script>

Это ответ на вопрос:

var out = document.getElementById('outLine');
out.innerHTML += "X\t»\tSUM\tSUM-X\tLIST\r\n";
function isSubsetSum(set, n, sum)  { 
	if (sum == 0) { return true; }
	if (n == 0 && sum != 0) { return false; }
	if (set[n - 1] > sum) { return isSubsetSum(set, n - 1, sum); }
	return isSubsetSum(set, n - 1, sum) ||
		isSubsetSum(set, n - 1, sum - set[n - 1]); 
} 
function v1chNum(x) {
	var r = [1];
	var n = 0;
	var m = x/2;
	for(var i = 2; i <= m; i++ ) {
		if(x%i==0) {
			if(r.indexOf(i)==-1) {
				r.push(i);
				n += i;
			}
			m = x/i;
			if(r.indexOf(m)==-1) {
				r.push(m);
				n += m;
			}
		}
	}
	if( n > x ) {
		r.sort(function(a, b) {return b - a;});
		if(!isSubsetSum(r,r.length,x)) {
			out.innerHTML += x+"\t»\t"+n+"\t"+(n-x)+"\t"+r+"\r\n";
		} else { return false; }
	} else { return false; }
}
for(var x = 1; x<1000; x++) {
	v1chNum(x);
}
<pre id="outLine"></pre>
[ 1110]

198
задан xyz 19 May 2010 в 23:38
поделиться

5 ответов

Значение по умолчанию для enum (на самом деле, любой тип значения) 0 - даже если это не допустимое значение для этого enum. Это не может быть изменено.

332
ответ дан Yair Nevet 23 November 2019 в 05:10
поделиться

Значение по умолчанию перечисления является любым перечислением, приравнивается к нулю. Я не полагаю, что это изменяемо атрибутом или другими средствами.

(MSDN заявляет: "Значение по умолчанию перечисления E является значением, произведенным выражением (E) 0".)

17
ответ дан Joe 23 November 2019 в 05:10
поделиться

Вы не можете, но если хотите, можете проделать какую-нибудь трюк. :)

    public struct Orientation
    {
        ...
        public static Orientation None = -1;
        public static Orientation North = 0;
        public static Orientation East = 1;
        public static Orientation South = 2;
        public static Orientation West = 3;
    }

использование этой структуры как простого перечисления.
где вы можете создать pa == Orientation.East (или любое другое значение, которое хотите) по умолчанию
чтобы использовать сам трюк, вам нужно преобразовать из int по коду.
там реализация:

        #region ConvertingToEnum
        private int val;
        static Dictionary<int, string> dict = null;

        public Orientation(int val)
        {
            this.val = val;
        }

        public static implicit operator Orientation(int value)
        {
            return new Orientation(value - 1);
        }

        public static bool operator ==(Orientation a, Orientation b)
        {
            return a.val == b.val;
        }

        public static bool operator !=(Orientation a, Orientation b)
        {
            return a.val != b.val;
        }

        public override string ToString()
        {
            if (dict == null)
                InitializeDict();
            if (dict.ContainsKey(val))
                return dict[val];
            return val.ToString();
        }

        private void InitializeDict()
        {
            dict = new Dictionary<int, string>();
            foreach (var fields in GetType().GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                dict.Add(((Orientation)fields.GetValue(null)).val, fields.Name);
            }
        } 
        #endregion
11
ответ дан 23 November 2019 в 05:10
поделиться

Фактически по умолчанию перечисление является первым элементом в перечислении , значение которого равно 0 .

Итак например:

public enum Animals
{
    Cat,
    Dog,
    Pony = 0,
}
//its value will actually be Cat not Pony unless you assign a non zero value to Cat.
Animals animal;
6
ответ дан 23 November 2019 в 05:10
поделиться

Значение любого перечисления по умолчанию равно нулю. Поэтому, если вы хотите установить один перечислитель в качестве значения по умолчанию, установите для него значение ноль, а для всех других перечислителей значение, отличное от нуля (первый перечислитель, имеющий нулевое значение, будет значением по умолчанию для этого перечисления, если имеется несколько счетчиков. с нулевым значением).

enum Orientation
{
    None = 0, //default value since it has the value '0'
    North = 1,
    East = 2,
    South = 3,
    West = 4
}

Orientation o; // initialized to 'None'

Если вашим счетчикам не нужны явные значения, просто убедитесь, что первым перечислителем является тот, который вы хотите использовать в качестве счетчика по умолчанию, поскольку «По умолчанию первый счетчик имеет значение 0, а значение каждого последующего счетчика увеличивается на 1. " ( Ссылка на C # )

enum Orientation
{
    None, //default value since it is the first enumerator
    North,
    East,
    South,
    West
}

Orientation o; // initialized to 'None'
62
ответ дан 23 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: