你会如何处理这个难题? (仅查找数字的唯一因子。)

时间:2012-04-19 01:59:03

标签: set factorization

我正在采访Interview Street的“不友好号码”谜题。

它是这样的:

给定一个整数和另一个整数列表,找到仅对给定整数唯一的因子,并且不与其他整数列表共享。

因此,如果设置1(设置Y)是(并且n是给定数字):

∃Y{z | n%z = 0}

基本上:每个z都有一个Y,其中z是n%z为0的数字。

我们希望Y的集合差减去包含其他数字列表的所有因子的集合。

那你怎么看待这个?

找出整数n的因子?其他数字的所有因素,只是清除了非独特因素?

或者你只会找到n的因子,只是用它们来划分其他数字并清除非唯一数字?

或者有没有办法在不考虑数字的情况下做到这一点?

到目前为止,我已经使用了试验部门,Pollard的Rho,布伦特对Pollard的Rho和Fermat的因子分解方法的变化。我也使用了Lucas-Lehmer素性测试和Euclids GCD。

但到目前为止,没有,只是错误答案的组合或超过时限。一个已知的解决方案应该涉及轮子筛,但我不确定那是什么。

非常感谢。

1 个答案:

答案 0 :(得分:0)

让你的清单大小为x,让数字为n。然后期望x * sqrt(n)

的时间复杂度

1 - 找到所有素数直到n的

2-对于在列表中划分n但没有元素的每个素数,添加到结果集

3-返回结果集

public static List<Integer> uniqueFactors(int n, int[] list){
    //find possible prime factors of n: O(sqrt(n))
    int factors = (int)Math.sqrt(n);
    boolean [] P = new boolean[factors+1];
    Arrays.fill(P, true);
    P[0]=P[1]= false;//0 and 1 are not primes
    int limit =(int) Math.sqrt(factors)+1;//prime search limit
    for(int i=2; i <= limit; i++ )
        if(P[i]) {
            int y;
            for(int x=2; (y=x*i)<=factors; x++)
                if(P[y])
                    P[y]=false;
        }
    //retrieve/identify all prime factors of n that are not prime factors of elements in list
    //O is sqrt(n) * list
    List<Integer> result = new ArrayList<Integer>();
    for(int i=2; i<=factors; i++)
        if(P[i] && n%i==0) {//if i is prime and a factor of n
            boolean shared = false;
            for(int el: list)
                if(el%i==0) {
                    shared=true;
                    break;
                }
            if(!shared)
                result.add(i);
        }//if
    return result;
}//uniqueFactors

使用

进行测试
public static void main(String[] args) {
    int n=2*3*5*7*11*13*17*19;
    int list[]= {8,9,25,98,121,38};
    System.out.println(uniqueFactors(n,list));
}

print out: [13, 17]

我运行的解决方案的所有其他变体仍然以Big-O结束:sqrt(n)* list_size