条件:
设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();
}
最佳答案
这里有两个问题:
你不能把两个友好的对数字相加。
你包含的是完全数(其中d(n)=n),因为a≠b被违反,所以不符合友好对的条件。
我认为当你没有在列表中添加来存储传递的数字时,你就更接近了,因为这导致了上面的问题1,因为你只在总和中添加了number1
的贡献,但是在列表中同时添加了number1
和number2
,最终导致number2
被跳过要解决问题2,还需要验证number1 != number2
。例如:
if (number2 == i && number1 != number2)
^^^^^^^^^^^^^^^^^^^^^ add this check
{
sum = sum + i;
在对您提供的代码应用这两个修复程序之后,我得到了预期的总数31626。
关于c# - 欧拉计划#21,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36439222/