给定一个数字N。找到所有N的可和数字之和。如果A和B是可配对的对(如果第一个等于第二个除数的和,则两个数字是可和的),则将A和B称为亲和的数字。
例子:
Input : 284
Output : 504
Explanation : 220 and 284 are two amicable numbers upto 284
Input : 250
Output : 220
Explanation : 220 is the only amicable number
方法:
一种有效的方法是将所有友好数字存储在一个集合中,并且对于给定的N总和,集合中所有小于等于N的数字。
下面的代码是上述方法的实现:
C++
// CPP program to find sum of all
// amicable numbers up to n
#include
using namespace std;
#define N 100005
// Function to return all amicable numbers
set AMICABLE()
{
int sum[N];
memset(sum, 0, sizeof sum);
for (int i = 1; i < N; i++) {
// include 1
sum[i]++;
for (int j = 2; j * j <= i; j++) {
// j is proper divisor of i
if (i % j == 0) {
sum[i] += j;
// if i is not a perfect square
if (i / j != j)
sum[i] += i / j;
}
}
}
set s;
for (int i = 2; i < N; i++) {
// insert amicable numbers
if (i != sum[i] and sum[i] < N and i == sum[sum[i]]
and !s.count(i) and !s.count(sum[i])) {
s.insert(i);
s.insert(sum[i]);
}
}
return s;
}
// function to find sum of all
// amicable numbers up to N
int SumOfAmicable(int n)
{
// to store required sum
int sum = 0;
// to store all amicable numbers
set s = AMICABLE();
// sum all amicable numbers upto N
for (auto i = s.begin(); i != s.end(); ++i) {
if (*i <= n)
sum += *i;
else
break;
}
// required answer
return sum;
}
// Driver code to test above functions
int main()
{
int n = 284;
cout << SumOfAmicable(n);
return 0;
}
Java
// Java program to find sum of all
// amicable numbers up to n
import java.util.*;
class GFG
{
static final int N=100005;
// Function to return all amicable numbers
static Set AMICABLE()
{
int sum[] = new int[N];
for(int i = 0; i < N; i++)
sum[i]=0;
for (int i = 1; i < N; i++)
{
// include 1
sum[i]++;
for (int j = 2; j * j <= i; j++)
{
// j is proper divisor of i
if (i % j == 0)
{
sum[i] += j;
// if i is not a perfect square
if (i / j != j)
sum[i] += i / j;
}
}
}
Set s = new HashSet();
for (int i = 2; i < N; i++)
{
// insert amicable numbers
if (i != sum[i] && sum[i] < N && i == sum[sum[i]])
{
s.add(i);
s.add(sum[i]);
}
}
return s;
}
// function to find sum of all
// amicable numbers up to N
static int SumOfAmicable(int n)
{
// to store required sum
int sum = 0;
// to store all amicable numbers
Set s = AMICABLE();
// sum all amicable numbers upto N
for (Integer x : s)
{
if (x <= n)
sum += x;
}
// required answer
return sum;
}
// Driver code
public static void main(String args[])
{
int n = 284;
System.out.println( SumOfAmicable(n));
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 program to findSum of all
# amicable numbers up to n
import math as mt
N = 100005
# Function to return all amicable numbers
def AMICABLE():
Sum = [0 for i in range(N)]
for i in range(1, N):
Sum[i] += 1
for j in range(2, mt.ceil(mt.sqrt(i))):
# j is proper divisor of i
if (i % j == 0):
Sum[i] += j
# if i is not a perfect square
if (i // j != j):
Sum[i] += i // j
s = set()
for i in range(2, N):
if(i != Sum[i] and Sum[i] < N and
i == Sum[Sum[i]] and i not in s and
Sum[i] not in s):
s.add(i)
s.add(Sum[i])
return s
# function to findSum of all amicable
# numbers up to N
def SumOfAmicable(n):
# to store requiredSum
Sum = 0
# to store all amicable numbers
s = AMICABLE()
#Sum all amicable numbers upto N
s = sorted(s)
for i in s:
if (i <= n):
Sum += i
else:
break
# required answer
return Sum
# Driver Code
n = 284
print(SumOfAmicable(n))
# This code is contributed by
# mohit kumar 29
C#
// C# program to find sum of all
// amicable numbers up to n
using System;
using System.Collections.Generic;
class GFG
{
static readonly int N = 100005;
// Function to return all amicable numbers
static HashSet AMICABLE()
{
int []sum = new int[N];
for(int i = 0; i < N; i++)
sum[i] = 0;
for (int i = 1; i < N; i++)
{
// include 1
sum[i]++;
for (int j = 2; j * j <= i; j++)
{
// j is proper divisor of i
if (i % j == 0)
{
sum[i] += j;
// if i is not a perfect square
if (i / j != j)
sum[i] += i / j;
}
}
}
HashSet s = new HashSet();
for (int i = 2; i < N; i++)
{
// insert amicable numbers
if (i != sum[i] && sum[i] < N &&
i == sum[sum[i]])
{
s.Add(i);
s.Add(sum[i]);
}
}
return s;
}
// function to find sum of all
// amicable numbers up to N
static int SumOfAmicable(int n)
{
// to store required sum
int sum = 0;
// to store all amicable numbers
HashSet s = AMICABLE();
// sum all amicable numbers upto N
foreach (int x in s)
{
if (x <= n)
sum += x;
}
// required answer
return sum;
}
// Driver code
public static void Main()
{
int n = 284;
Console.WriteLine( SumOfAmicable(n));
}
}
/* This code contributed by PrinciRaj1992 */
PHP
输出:
504