鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 欧拉计划

题目21:计算10000以下所有相亲数之和

[复制链接]
发表于 2020-10-17 11:29:15 | 显示全部楼层
  1. '''计算小于10000的所有亲和数之和'''

  2. def amicable(num):
  3.     sum = 0
  4.     Amicable = {}
  5.     AMICABLE = []
  6.     AMI = {}

  7.     for number in range(1,num):
  8.         factsum = 0

  9.         for factors in range(1,int(number/2)+1):
  10.             if number % factors == 0:
  11.                 factsum += factors
  12.         Amicable[number] = factsum

  13.     for i in range(1,len(Amicable)):
  14.         for j in range(1,len(Amicable)):
  15.             if Amicable[i] == j and Amicable[j] == i and i != j:
  16.                 AMICABLE.append(i)
  17.                 AMICABLE.append(j)

  18.     AMICABLE = list(set(AMICABLE))
  19.     print("在%d以下的亲和数为:" %num)
  20.     print(AMICABLE)
  21.     for numbers in AMICABLE:
  22.         AMI[numbers] = Amicable[numbers]
  23.         sum += numbers

  24.     print("它们分别的因数和为:")
  25.     print(AMI)
  26.     print("它们的因数总和为:%d" %sum)

  27. start_amicable = time.time()
  28. amicable(10000)
  29. time_amicable = time.time() - start_amicable
  30. print("%f秒" %time_amicable)
复制代码


在10000以下的亲和数为:
[1184, 6368, 5564, 5020, 2924, 284, 6232, 1210, 220, 2620]
它们分别的因数和为:
{1184: 1210, 6368: 6232, 5564: 5020, 5020: 5564, 2924: 2620, 284: 220, 6232: 6368, 1210: 1184, 220: 284, 2620: 2924}
它们的因数总和为:31626
7.503518秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-16 11:42:10 | 显示全部楼层
def d(n):
    div = []
    i = 1
    for i in range(1, n // 2 + 1):
        if n % i == 0:
            div.append(i)
    #print (div)
    sum = 0
    for each in div:
        sum  += each
    #print(sum)
    return sum
def is_amicable(n1, n2):
    if (d(n1) == n2) and (d(n2) == n1) and (n1 != n2):
        return True
    return False

def calc(n):
    am = []
    while n :
        a = d(n)
        if is_amicable(a, n) and a != n:
            am.append(a)
            am.append(n)
        n = n - 1
    am = set(am)
    print (am)
    sum = 0
    for each in am:
        sum += each
    print (sum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:46:14 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <time.h>

  3. main()
  4. {
  5.         int i, j, k, sum = 0, temp, x, y, z, a;
  6.         int begin, end;
  7.        
  8.         begin = time(NULL);
  9.        
  10.         for (i = 10; i < 10000; i++)
  11.         {
  12.                 if (i == z) //当找到一个亲和数,它的相亲数直接跳过循环
  13.                 {
  14.                         sum += z;
  15.                         goto Label;
  16.                 }
  17.                 k = i / 2;
  18.                 temp = 0;
  19.                 y = 0;
  20.                 for (j = 2; j <= k; j++)//找真因子
  21.                 {
  22.                         if (i % j == 0)
  23.                         {
  24.                                 temp += j;
  25.                         }
  26.                 }
  27.                 temp++;
  28.                 z = temp;
  29.                 x = temp / 2;
  30.                 for (j = 2; j <= x; j++)//找真因子
  31.                 {
  32.                         if (temp % j == 0)
  33.                         {
  34.                                 y += j;
  35.                         }
  36.                 }
  37.                 y++;
  38.                 if (y == i && y != z)
  39.                 {
  40.                         sum += i;

  41.                         a = z;
  42.                 }
  43.         Label:continue;
  44.         }
  45.         end = time(NULL);
  46.         printf("%d\n", sum);
  47.         printf("time = %d", end - begin);
  48. }
复制代码



31626
time = 0

自己进行了小小的优化,应该还有很多提升空间,望大佬指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-15 12:15:49 | 显示全部楼层
#计算10000以下所有相亲数之和
def amicable_number(n):
    ami = []
    sum = 0
    for i in range(1, n):
        if n % i == 0:
            ami.append(i)
    for each in ami:
        sum += each
    return sum

result = 0
for num in range(1, 10001):
    a = amicable_number(num)
    if amicable_number(a) == num and a != num:
        result += num

print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 20:13:57 | 显示全部楼层
本帖最后由 guosl 于 2022-1-2 20:26 编辑

此题可以打表记录亲和数,用空间换时间。
  1. /*
  2. 答案:31626
  3. 耗时:0.0072575秒
  4. */
  5. #include <iostream>
  6. using namespace std;

  7. const int N = 10000;
  8. char a[N + 4];

  9. int getFactorsSum(int n)//计算n的各因数之和
  10. {
  11.   int d = (int)sqrt((double)n);
  12.   int s = 1;
  13.   for (int i = 2; i <= d; ++i)
  14.   {
  15.     if (n % i == 0)
  16.     {
  17.       int m = n / i;
  18.       if (m == i)
  19.         s += i;
  20.       else
  21.         s += i + m;
  22.     }
  23.   }
  24.   return s;
  25. }

  26. int main(void)
  27. {
  28.   int nS = 0;
  29.   for (int i = 2; i <= N; ++i)
  30.   {
  31.     if (a[i] == 0)
  32.     {
  33.       int k = getFactorsSum(i);//计算i的各因数之和
  34.       if (k != i)//各因数之和不能等于自身
  35.       {
  36.         int k1 = getFactorsSum(k);//计算k的各位因数之和
  37.         if (k1 == i) //i和k是互为亲和数
  38.         {
  39.           a[i] = 1;
  40.           nS += i;
  41.           if (k <= N)
  42.             a[k] = 1;
  43.         }
  44.       }
  45.     }
  46.     else
  47.       nS += i;
  48.   }
  49.   cout << nS << endl;
  50.   return 0;
  51. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-11 11:15:12 | 显示全部楼层
  1. import time as t

  2. start = t.perf_counter()


  3. def seeking_factor(a_num):
  4.     factors = []
  5.     if a_num >= 1:
  6.         factors.append(1)
  7.     else:
  8.         return factors
  9.     divisor = 2
  10.     upper_limit = a_num
  11.     while divisor < upper_limit:
  12.         if not a_num % divisor:
  13.             factors.append(divisor)
  14.             upper_limit = int(a_num / divisor)
  15.             factors.append(upper_limit)
  16.         divisor += 1
  17.     # factors.sort()

  18.     return factors


  19. affinity_nums = []
  20. num_bool = []
  21. for i in range(10000):
  22.     num_bool.append(True)

  23. for n in range(10000):
  24.     if num_bool[n]:
  25.         d_n = sum(seeking_factor(n))
  26.         try:
  27.             num_bool[d_n]
  28.             a = sum(seeking_factor(d_n))
  29.             if n == a and n != d_n:
  30.                 affinity_nums.append(n)
  31.                 affinity_nums.append(d_n)
  32.                 num_bool[n] = False
  33.                 num_bool[d_n] = False
  34.             else:
  35.                 num_bool[n] = False
  36.         except IndexError:
  37.             num_bool[n] = False

  38. print(affinity_nums)
  39. print(sum(affinity_nums))
  40. print("It costs %f s" % (t.perf_counter() - start))
复制代码


结果:
[220, 284, 1184, 1210, 2620, 2924, 5020, 5564, 6232, 6368]
31626
It costs 0.913826 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-20 19:26:58 | 显示全部楼层
python
31626
时间:0.02099919319152832s
  1. import time
  2. tt=time.time()
  3. n=10000
  4. data=[1]*n
  5. for i in range(2,int(n**0.5+1)):
  6.     for j in range(i,n):
  7.         if i*j>n:
  8.             break
  9.         elif i==j:
  10.             data[i*j-1]=data[i*j-1]+i
  11.         else:
  12.             data[i*j-1]=data[i*j-1]+i+j
  13. he=0
  14. for i in range(1,n+1):
  15.     if data[i-1]<=n and not data[i-1]==i:
  16.         if data[data[i-1]-1]==i:
  17.             he=he+i
  18.             print(i)
  19. print(he)
  20. print("时间:{}s".format(time.time()-tt))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-2 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表