我正在采访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。
但到目前为止,没有,只是错误答案的组合或超过时限。一个已知的解决方案应该涉及轮子筛,但我不确定那是什么。
非常感谢。
答案 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