题目内容:
给出包含M个数字的列表,和列表中所有数字的所有质因数。求出最长的子列表,使得子列表中所有数字的乘积是一个完全平方数.
输入描述
输入文件包含多组测试数据。第一行包含两个整数N , M ( 1 <= N <= 30 , 1 <= M <= 30000 ). N
是质因数的个数。接下来一行有N个整数,给出所有的质因数。然后一行包含M个整数,给出列表。
输出描述
对于每组数据,输出最长子列表的两个位置坐标l r。l是该子列表在列表中的起始位置,r是结束位置
。如果多种情况都满足子列表长度最大,输出l最小的一个。如果不存在这样的子列表输出“None”。
输入样例
3 4
2 3 5
4 9 25 6
3 4
2 3 5
6 6 3 3
0 0
输出样例
1 3
1 4
大家能帮我看看我的代码有什么问题吗,或者可以贴一下您的思路或代码吗?下面是我的代码:
1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class SquareNumber { 5 6 static int MAX_N = 30; 7 static int MAX_M = 30000; 8 static ArrayList<String> list = new ArrayList<>(); 9 10 public static void main(String[] args) { 11 Scanner sc = new Scanner(System.in); 12 int[] A = new int[MAX_N]; 13 int[] B = new int[MAX_M]; 14 int N, M, i; 15 while (sc.hasNext()) { 16 N = sc.nextInt(); 17 M = sc.nextInt(); 18 if (M == 0 && N == 0){ 19 break; 20 } 21 for (i = 0; i < N; i++) { 22 A[i] = sc.nextInt(); 23 } 24 for (i = 0; i < M; i++) { 25 B[i] = sc.nextInt(); 26 } 27 squareNumber(A, B, N, M); 28 } 29 for (String s : list) { 30 System.out.println(s); 31 } 32 } 33 static void squareNumber(int[] A, int[] B, int N, int M) { 34 int i, j, k, t; 35 boolean flag; 36 37 int[] num = new int[MAX_N]; 38 int temp = 1; 39 40 int len_max = 0; 41 int r = 0; 42 int f = 0; 43 44 for (i = 0; i < M; i++) { 45 for (j = i + 1 + len_max; j <= M; j++) { 46 for (k = 0; k < N; k++) { 47 num[k] = 0; 48 } 49 for (k = i; k < j; k++) { 50 temp = B[k]; 51 while (temp != 1) { 52 flag = false; 53 for (t = 0; t < N; t++) { 54 if (temp % A[t] == 0) { 55 temp /= A[t]; 56 num[t]++; 57 flag = true; 58 } 59 } 60 if (!flag) { 61 return; 62 } 63 } 64 } 65 flag = true; 66 for (k = 0; k < N; k++) { 67 68 if (num[k] % 2 == 1) { 69 flag = false; 70 break; 71 } 72 } 73 if (flag) { 74 len_max = j - i; 75 f = i + 1; 76 r = j; 77 } 78 } 79 } 80 if (f == 0 && r == 0) { 81 list.add("None"); 82 } else { 83 list.add(f + " " + r); 84 } 85 } 86 }