[英]Project Euler #21
条件:
令d(n)定义为n的适当除数之和(小于n的数,均分为n)。 如果d(a)= b且d(b)= a,其中a≠b,则a和b是友好对,而a和b的每一个都称为友好数。
例如,适当的220除数是1,2,4,5,10,11,20,22,44,55和110; 因此d(220)=284。284的适当除数是1,2,4,71和142; 因此d(284)= 220。
评估10000以下所有友好数字的总和。
我做了以下事情:
static void Main()
{
long sum = 0;
List<int> passedValues = new List<int>();
for (int i = 1; i < 10000; i++)
{
var number1 = SumOfNumber(i);
var number2 = SumOfNumber(SumOfNumber(i));
if (number2 == i && !passedValues.Contains(number1))
{
sum = sum + number1;
passedValues.Add(number1);
passedValues.Add(number2);
}
}
Console.WriteLine(sum);
Console.ReadKey();
}
private static int SumOfNumber(int input)
{
int sum = 0;
for (int i = 1; i <= input/2; i++)
{
if (input%i == 0)
{
sum += i;
}
}
return sum;
}
但是它给出的结果是40284,而正确的答案似乎是31626,为什么我的程序不能正常工作? 我是否多次添加内容? 我还尝试添加一个列表来存储传递的值,但是最终结果为25008:
static void Main()
{
long sum = 0;
List<int> passed = new List<int>();
for (int i = 1; i < 10000; i++)
{
var number1 = SumOfNumber(i);
var number2 = SumOfNumber(SumOfNumber(i));
if (number2 == i && !passed.Contains(i))
{
sum = sum + number1;
passed.Add(number1);
}
}
Console.WriteLine(sum);
Console.ReadKey();
}
这里有两个问题:
我认为当您不添加列表来存储传递的数字时,您就更近了,因为这导致了上面的问题#1,因为您只将number1
的贡献添加到总和中,但是将number1
和number2
都添加到了列表中number2
最终被跳过。 要解决问题2,您还需要验证number1 != number2
。 例如:
if (number2 == i && number1 != number2)
^^^^^^^^^^^^^^^^^^^^^ add this check
{
sum = sum + i;
将这两个修复程序应用于您提供的代码后,我得到的预期总数为31626。
我得到的结果是31626。这里的区别是如何防止总和重复。 只是确保我始终小于number1,而不是保存到列表中。
static void Main()
{
long sum = 0;
List<int> passedValues = new List<int>();
for (int i = 1; i < 10000; i++)
{
var number1 = SumOfNumber(i);
var number2 = SumOfNumber(SumOfNumber(i));
if (number2 == i && i < number1)
{
sum = sum + i + number1;
}
}
Console.WriteLine(sum );
Console.ReadKey();
}
private static int SumOfNumber(int input)
{
int sum = 0;
for (int i = 1; i <= input / 2; i++)
{
if (input % i == 0)
{
sum += i;
}
}
return sum;
}
private static int SumOfNumber(int input)
{
int sum = 0;
for (int i = 1; i <= input/2; i++)
{
if (input%i == 0)
{
sum += i;
}
}
return sum;
}
这是不正确的。 您只添加了其中一个因素,而没有增加数字的平方根。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.