0

所以我有这个问题,我不太明白。

我想了解问题的处理方法

想象以下场景:

你是一家有 1000 名员工的公司的人力资源经理,编号从 1 到 1000。你的老板让你给员工发一大笔圣诞奖金,但没有告诉你他们的名字。相反,他们给了你两个迹象:

1)员工号的真除数之和(包括1但不包括自身)大于员工号本身

2) 这些除数的任何子集都不会与员工人数本身相加。

有多少员工有资格获得奖金?他们的人数是多少?

例如: - 数字 12:正确的除数是 1、2、3、4 和 6。和是 1+2+3+4+6 = 16,大于 12 并且符合第一个条件。但是,子集 2+4+6=12 违反了第二个条件。

我的结论是: 我必须得到从 1 到 1000 的这些数字,其中数字的除数之和大于数字本身(包括 1 但不包括本身),但除数的子集不能相加等于号码本身?

我的步骤是:

  • 将 1 到 1000 的数字的除数放入一个数组中
  • 当除数的总和(包括 1 但不包括自身)大于数字本身时,获取这些数字,并将数组的大小调整为仅这些数字。
  • 我必须检查剩余数字的除数的每个子集,并在除数的子集可以与数字本身相等时删除它们。

如果这是一个好方法,或者你们中的任何人知道更有效/更好的方法,你能帮我吗?

任何帮助,将不胜感激!

注意:我不希望你解决它,我想了解它!

4

3 回答 3

1

到目前为止,我已经完成了这个,它涵盖了我打算做的前两个步骤。最后一步超出了我的知识范围,但我也有解决方案。

这是我的代码:

<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>

于 2019-01-20T16:00:10.683 回答
0

我在python中的代码:

def getDivisors(n):
    div = []
    for i in range(1, n-1):
        if(n%i == 0):
            div.append(i)
    return div

def sumDivisors(arr):
    div_sum = 0
    for i in arr:
        div_sum += i
    return div_sum

def subLists(arr):
    lists = [[]]
    for i in range(len(arr)):
        orig = lists[:]
        new = arr[i]
        for j in range(len(lists)):
            lists[j] = lists[j] + [new]
        lists = orig + lists
    return lists

def sumSublists(lists, n):
    for i in range(len(lists)):
        sum_list = sum(lists[i])
        if (sum_list == n):
            return False
    return True

for num in range(100):
    arr = getDivisors(int(num))
    lists = subLists(arr)
    if ((sumDivisors(arr) > int(num))and(sumSublists(lists, int(num)))):
        print(str(num) + '/n')
于 2021-01-08T09:22:01.520 回答
0

PHP方法:

$empList = [];

        for ($emp = 1; $emp <= 100; $emp++) {

            $multiples = [];
            $subset = [];
            $cond1 = false;
            $cond2 = false;

            // Get multiples.
            for ($i = 1; $i < $emp; $i++) {
                if ($emp % $i == 0) $multiples[]= $i;
            }

            // Condition 1
            if (array_sum($multiples) > $emp) $cond1 = true;


            foreach ($multiples as $num) {
                if ($num % 2 == 0) $subset[]= $num;
            }

            // Condition 2
            if (array_sum($subset) > $emp) $cond2 = true;

            if ($cond1 && $cond2) $empList[] = $emp;
        }

        echo "<pre>";
        var_dump($empList);
        echo "</pre>";

输出:

Array
(
    [0] => 24
    [1] => 36
    [2] => 40
    [3] => 48
    [4] => 60
    [5] => 72
    [6] => 80
    [7] => 84
    [8] => 96
)
于 2019-01-25T20:55:11.177 回答