Я сделал это до сих пор, который охватывает первые два шага, которые я намеревался сделать. Последний шаг мне неизвестен, но у меня есть решение и для этого.
Это мой код:
<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] Значение по умолчанию для enum
(на самом деле, любой тип значения) 0 - даже если это не допустимое значение для этого enum
. Это не может быть изменено.
Значение по умолчанию перечисления является любым перечислением, приравнивается к нулю. Я не полагаю, что это изменяемо атрибутом или другими средствами.
(MSDN заявляет: "Значение по умолчанию перечисления E является значением, произведенным выражением (E) 0".)
Вы не можете, но если хотите, можете проделать какую-нибудь трюк. :)
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
Фактически по умолчанию перечисление
является первым элементом в перечислении
, значение которого равно 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;
Значение любого перечисления по умолчанию равно нулю. Поэтому, если вы хотите установить один перечислитель в качестве значения по умолчанию, установите для него значение ноль, а для всех других перечислителей значение, отличное от нуля (первый перечислитель, имеющий нулевое значение, будет значением по умолчанию для этого перечисления, если имеется несколько счетчиков. с нулевым значением).
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'