首页 新闻 会员 周边

一道算法题,用的方法有点笨拙,一直AC不了

0
[待解决问题]

题目内容:
给出包含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 }
ctgu_wgl的主页 ctgu_wgl | 菜鸟二级 | 园豆:202
提问于:2017-10-29 10:42
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册