如何优化代码以查找Amicable Pairs

时间:2010-11-18 18:09:34

标签: optimization number-theory

请参阅我用过的代码,找出我认为的所有Amicable Pairs(n,m),n< m,2< = n< = 6500万。我的代码:http://tutoree7.pastebin.com/wKvMAWpT。找到的对:http://tutoree7.pastebin.com/dpEc0RbZ

我发现我的笔记本电脑上每增加一百万,现在需要24分钟。我希望有大量的n可以提前过滤掉。这很接近,但没有雪茄:奇数n不会以'5'结尾。到目前为止只有一个反例,但这太多了:(34765731,36939357)。作为过滤器将过滤掉所有n的40%。

我希望有一些想法,不一定是用于实现它们的Python代码。

3 个答案:

答案 0 :(得分:0)

这是一篇很好的文章,总结了 finding amicable pairs

的所有优化技巧

sample C++ code

它可以在不到一秒的时间内找到所有友好数字,最多可达10 ^ 9。

答案 1 :(得分:0)

#include<stdio.h>
#include<stdlib.h>
int sumOfFactors(int );

int main(){
    int x, y, start, end;
    printf("Enter start of the range:\n");
    scanf("%d", &start);
    printf("Enter end of the range:\n");
    scanf("%d", &end);

    for(x = start;x <= end;x++){
        for(y=end; y>= start;y--){
            if(x == sumOfFactors(y) && y == sumOfFactors(x) && x != y){
                printf("The numbers %d and %d are Amicable pair\n", x,y);
            }
        }
    }   
    return 0;
}

int sumOfFactors(int x){
    int sum = 1, i, j;
    for(j=2;j <= x/2;j++){
        if(x % j == 0)
            sum += j;
    }
    return sum;
}

答案 2 :(得分:0)

def findSumOfFactors(n):
    sum = 1
    for i in range(2, int(n / 2) + 1):
        if n % i == 0:
            sum += i
    return sum

start = int(input())
end = int(input())

for i in range(start, end + 1):
    for j in range(end, start + 1, -1):
        if i is not j and findSumOfFactors(i) == j and findSumOfFactors(j) == i and j>1:
            print(i, j)