亲和数计算器
亲和数(
引言
什么是友好的数字?答案可以在这里的维基百科上找到。
有人请求我帮助他完成学校作业,编写一个应用程序来生成第一个大于 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
处的配对。在计算总和时,我需要在总和中添加 i
和 n / 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 日:初始发布