【问题标题】:how to find number of rows and columns of 2D array to store prime numbers between 0 to 1000如何查找二维数组的行数和列数以存储 0 到 1000 之间的素数
【发布时间】:2020-01-14 13:11:56
【问题描述】:

取 0 - 1000 个数字,并找出该范围内的质数。将质数存储在二维数组中,第一维表示范围 0-100、100-200 等。而第二维表示该范围内的素数...

要存储在二维数组中,我们需要知道行数和列数..有人可以帮助我吗?...findPrimNumbers 方法返回整数 []...但是我必须将质数存储在二维中整数数组。 这是我写的代码。

 public class PrimeNmbers2D 
       {
        public static boolean isPrime(int number)
        {
            boolean status=true;
            for(int n=0;n<=number;n++)
            {
                int count=0;
                for(int i=1;i<=number;i++)
                {
                    if(n%i==0)
                    {
                        count++;
                    }
                }
                if(count==2)
                {
                    status=true;

                }

            }
            return status;
        }
        public static Integer[] findPrimeNumbers(int start,int end)
        {
            ArrayList<Integer> primes=new ArrayList<>();
            for(int from=start;from<=end;from++) 
            {
                if(isPrime(from))
                {
                    primes.add(from);
                }

            }
            return primes.toArray( new Integer[primes.size()]);
        }
      public static void main(String[] args) 
      {
          int[][] primeGroups=new int[10][];
          for(int i=0;i<10;i++)
          {
              int start=0;
              int end=100;
              for(int j=0;j<10;j++)
              {
                  primeGroups[i][j]=findPrimeNumbers(start, end);

              }
              start=end+1;
              end=end+100;
          }

      }
    }

【问题讨论】:

  • 您的问题到底是什么?您面临哪些问题? “有人能帮我吗?” - 是的,如果你明确你的问题。
  • 如果我可以给你一些建议,你的代码是不必要的复杂,简化它。例如。变量名什么也没说。如果您只拨打您的号码num,那么您将不记得该号码的用途。您还有一个名为intArr 的列表和一个数组intArray(这是哪个?)。我想说的是,不要缩写(除了像i, j, k 这样的索引变量)并明智地选择名称。还有一件事,当您调用方法isSomething 时,人们期望一个布尔值(是还是不是?)而不是列表。抱歉,我帮不上忙。我相信您会很快找到解决方案(列表是个好主意)
  • @Amongalen 我的问题是我必须找到 0 到 1000 之间的素数并将所有素数存储在二维数组中

标签: java arrays


【解决方案1】:

我认为您的方法 isPrimeNum() 应该返回一个布尔值,如果返回为真,则将变量 num 添加到应返回的数组中。 另一件事是您的这部分代码是不必要的。

ArrayList <Integer>intArr=isPrimeNum(num);
Object [] obj = intArr.toArray();
Integer[] intArray = (Integer[])obj;

你可以使用下面的代码:

Integer[] myArray = intArr.toArray(new Integer[intArr.size()]);

但我没有完全理解您的代码的目的,如果您需要从 0 到 1000 的所有素数,为什么需要输入?你应该有一个方法来填充一个从 0 到 1000 的所有数字的数组,然后是另一个迭代该数组并将素数放入另一个数组中的方法,我们将调用该方法 findPrimeNumbers()。 findPrimeNumbers 方法应该接收包含所有数字的数组,并对每个数字调用 isPrimeNum() 方法,如果为 true,则添加到返回数组。

希望对您有所帮助。

【讨论】:

  • 有了findPrimeNumbers(),您甚至不需要包含0到1000之间所有数字的数组。您可以添加两个参数:findPrimeNumbers(int from, int to),然后创建一个for循环:for( ; from&lt;to; from++)和那么如果isPrimeNum(from)你把它添加到列表中。
  • @Rafael Strack,您的回答对我很有帮助。感谢您的帮助
  • GameDroids 建议的方法更好! @drug您不需要知道第二维的确切大小,它就像一个矩阵,您可以拥有相同大小的所有行,也可以具有不同的大小。以 GameDroids 为例: int[][] primeGroups = new int[10][]; primeGroups[0] = 新的 int[10]; primeGroups[1] = new int[5];
  • @RafaelStrack 是的...我已经做到了,但是...findPrimeNumber(); ....返回整数数组但是..我们需要 int 数组...再次这样做,我们需要创建一个 int 数组并从 Integer 数组中存储元素......这将与我发布的代码相同首先....如果我错了,请纠正我
  • @drug 啊,现在我想我明白了!你想把 Integer 的 ArrayList 转换成 int 的数组吗?你可以这样做: ArrayList primes = findPrimeNumbers(0,100); int[] arr = primes.stream().mapToInt(i -> i).toArray();
【解决方案2】:

在阅读了 Rafael Strack 的答案后,我想我现在明白了。

所以你需要找到从01000 的所有素数。然后将它们从0-100101-200201-300...中按质数分组。

这意味着你的结果是一个整数数组。

int[][] primeGroups;   // please excuse the name...

现在你必须初始化第一个维度:

int[][] primeGroups = new int[10][];

那是因为有 10 个组:

0 ->    0 - 100
1 ->  101 - 200
2 ->  201 - 300
3 ->  301 - 400 
4 ->  401 - 500 
5 ->  501 - 600 
6 ->  601 - 700 
7 ->  701 - 800
8 ->  801 - 900 
9 ->  901 -1000  

但是您的primeGroups 仍然是“空的”。因此,使用 Rafael Strack 的解决方案,您可以实现 isPrimeNum(int number) 并进行测试:

findPrimeNumbers(int from, int to){
   ArrayList<Integer> primes = new ArrayList<>();  // arrays don't grow dynamically, so you need a list and convert it in the end to an array
   for( ; from<to; from++){
        if(isPrimeNum(from)){
           primes.add(from);
        }
   }
   // at this point you have all your prime numbers from "from" to "to" in the primes list
   // now convert it and return it:
   return primes.toArray(new Integer[primes.size()]);   // ugly but it does the job
} 

最后你需要遍历你的 primeGroups 数组并用你找到的所有可能的 primeNumber 填充它:

primeGroups[0] = findPrimeNumbers(0,100);
...

等等。

编辑
您的代码中仍有一些“小问题”。这里有一些建议:

1您的isPrime(number) 方法的名称表明您想知道number 是否为prime。但是,您正在迭代从 n=0n=number 的所有数字,并测试所有数字是否为素数。删除外循环,它会给你留下类似的东西:

int count=0;
for(int i=1; i<=number; i++){
  ...
} 
return count==2;        // shortcut: no need to return true or false - just return the result of your condition

2现在开始您的第一个问题:您有一个 Integer-List 并且想要一个 int 数组,所以循环:

int[] result = new int[primes.size()];
for(int i=0;i<primes.size();i++){
    result[i] = primes.get(i);
}
return result;

3 这会给您的main 方法带来另外两个问题:

int start=0;
int end = 100;

需要在循环之外。否则你在每次迭代时重新初始化它们(这将导致相同数字的 10 倍)

最后,您的findPrimeNumbers(start, end) 已经返回int[]。所以你可以简单地将结果放在primeGroups[i]

你可以这样读:

int[][] primeGroups = new int[10][];  // array of int arrays primegroups is a new array and can contain 10 arrays
primeGroups[i] = findPrimeNumbers(start, end);  // primeGroups at index i is the result of findPrimeNumbers... (which is an array)

我希望这会有所帮助。

【讨论】:

  • ,您的回答对我很有用。感谢您的帮助,但是要将素数存储在二维数组中...我们需要知道行数和列数对吗?您只初始化了第一个维度..第二个维度呢...我会很感激..如果你能解释一下
  • findPrimeNumbers(0,100); //返回我们整数数组,但我们需要它作为整数数组
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
相关资源
最近更新 更多