65.9K
CodeProject 正在变化。 阅读更多。
Home

亲和数计算器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (2投票s)

2007年1月14日

CPOL

2分钟阅读

viewsIcon

38682

亲和数(1 到 200 万之间的成对数)

引言

什么是友好的数字?答案可以在这里的维基百科上找到。

有人请求我帮助他完成学校作业,编写一个应用程序来生成第一个大于 1,000,000(一百万)的友好数字对。我编写了一个小程序来计算这个。

友好的数字是这样一对数字:其中一个数字的所有真因子的和等于另一个数字,1被视为真因子,但不包括数字本身。例如 (220, 284);220 的真因子是 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 和 110,它们的和是 284;284 的真因子是 1, 2, 4, 71 和 142,它们的和是 220。友好的数字在毕达哥拉斯学派中就已经为人所知,他们认为这些数字具有许多神秘的特性。

计算真因子和的函数如下

public static int FastSum(int n)
{
    int sum = 1;
    int sqrt = (int)Math.Sqrt(n);
    for (int i = 2; i <= 1 + sqrt; i++)
        if (n % i == 0) sum = sum + i + n / i;
            return sum;
}

我来解释一下这个函数。一个数字的所有因子(在我的函数中是 i)都在 1 和该数字的 sqrt 之间,并且每个因子都有一个在 n / i 处的配对。在计算总和时,我需要在总和中添加 in / i

Main 函数中,我有一个在 1,000,000 和 2,000,000 之间的 for 循环 - 还有一个时间计数器,因为我想知道执行需要多长时间(对于每对数字,以及整个区间)。

Main 函数如下

static void Main(string[] args)
{
    DateTime st = DateTime.Now;
    TimeSpan runTime;
    int s1, s2;
    for (int i = 1000000; i < 2000000; i++)
    {
        s1 = FastSum(i);
        s2 = (s1 > i) ? FastSum(s1) : 0;
        if (s2 == i)
            Console.WriteLine("{0} <==> {1} {2}", i, s1, 
            (DateTime.Now - st).TotalSeconds);
    }
    DateTime et = DateTime.Now;
    runTime = et - st;
    Console.WriteLine("Run Time: " + runTime.TotalSeconds);
    Console.WriteLine("Press enter to exit!");
    Console.ReadLine();
}

首先,我保存开始时间:DateTime st = DateTime.Now; 然后,我开始验证大于 100 万的每个数字,使用一个 for 循环。

我为每个找到的对写入 Console.WriteLine("{0} <==> {1} {2}", i, s1, (DateTime.Now - st).TotalSeconds); 数字和计算时间。

完整的程序如下所示

using System;

    class Program
    {
        public static int FastSum(int n)
        {
            int sum = 1;
            int sqrt = (int)Math.Sqrt(n);
            for (int i = 2; i <= 1 + sqrt; i++)
                if (n % i == 0) sum = sum + i + n / i;
            return sum;
        }
        static void Main(string[] args)
        {
            DateTime st = DateTime.Now;
            TimeSpan runTime;
            int s1, s2;
            for (int i = 1000000; i < 2000000; i++)
            {
                s1 = FastSum(i);
                s2 = (s1 > i) ? FastSum(s1) : 0;
                if (s2 == i)
                    Console.WriteLine("{0} <==> {1} {2}", i, s1, 
                    (DateTime.Now - st).TotalSeconds);
            }
            DateTime et = DateTime.Now;
            runTime = et - st;
            Console.WriteLine("Run Time: " + runTime.TotalSeconds);
            Console.WriteLine("Press enter to exit!");
            Console.ReadLine();
        }
    }

这是 C# 代码。如果有人需要这段代码的 C 版本(翻译),这里是:

#include "stdafx.h"
#include <ctime>
#include <math.h>
#include < iostream>

using namespace std;

int FastSum(int n)
{
   int sum = 1;
   double m = n;
   for (int i = 2; i <= sqrt(m); i++)
      if(n % i == 0) sum += (i + n / i);
   return sum;
}
void main()
{
   int s1 = 0, s2 = 0, i = 1000000;
   bool ok = true;
   clock_t st = clock();
   //for (; ok ; )
   while (ok)
   {
      s1 = FastSum(i);
      s2 = (s1 > i) ? FastSum(s1) : 0;
      if (s2 == i++) cout << i - 1 << " <==> " << s1 << "  " << 
            (clock() - st)/1000.0 << (ok = false) <<endl;
   }

   clock_t et = clock();
   cout << "Time: " << (et-st)/1000.0 << endl;
   system("pause");
}

英语不是我的母语,所以为任何语言错误道歉!

历史

  • 2007 年 1 月 14 日:初始发布
© . All rights reserved.