在一个给你两个的游戏中 整数(X和Y),你必须打印特殊的数量 X和Y之间的数字包括在内。
特殊号码的属性如下:
特殊数字不能被任何数量的Z * Z形式整除,其中(Z> 1)。
输入: T,测试用例的数量。每个测试用例由两个空格分隔的整数组成,表示X和Y.
Output: The required answer in one line for each testcase. Constraints: 1 <= T <= 100 1 <= X,Y <= 10^9 0 <= |X-Y| <= 10^6
我的问题是,当我尝试计算所有数字内存不足时会出现错误。和时间限制是3秒,有人可以提出一个有效的算法吗?
i have wriiten the code like this:
public class GameOfNumbers {
public static void main(String[] args) {
GameOfNumbers g=new GameOfNumbers();
Scanner s=new Scanner(System.in);
int tc=s.nextInt(); //no of test cases
for(int i=1;i<=tc;i++){ // for each test case.
int x=s.nextInt(); // range 1(lower)
int y=s.nextInt(); // range 2(upper)
g.countSpecialNumbers(x,y);
}
}
private void countSpecialNumbers(int x, int y) {
int arr_nums[]=new int[y-x+1];
int z=0,l=x,count=0;
while(z<arr_nums.length){
arr_nums[z]=l++;
z++;
}
int c=(int)Math.sqrt(y);
for(int i=2;i<=c;i++){
for(int k=0;k<arr_nums.length;k++){if(arr_nums[k] !=-1 && arr_nums[k]%(i*i) == 0){arr_nums[k]=-1;}}
}
for(int k=0;k<arr_nums.length;k++){if(arr_nums[k] !=-1)count++;}
System.out.println(count);
}
}
答案 0 :(得分:1)
请注意,根据声明,您无需计算1000到10 ^ 9之间的所有数字。在每个测试用例中,您只需要以固定的长度间隔计算数字,长度不超过10 ^ 6(参见最后一个约束)。
您可以包含另一个优化 - 您只需要迭代不大于Y
的平方根的素数(尝试找出为什么)。您可以预先计算小于sqrt
10 ^ 9的素数列表,并仅对它们进行迭代。