为了账号安全,请及时绑定邮箱和手机立即绑定

测试数组中的数字是否重复,然后将其删除

测试数组中的数字是否重复,然后将其删除

DIEA 2022-01-12 16:10:58
所以我的问题是我必须在一个数组中列出一个数字的素数因子,以及另一个素数因子在给定数组内相同位置上的幂(所以如果你想要 60 的素数因子,我需要返回一个内容如下的数组:素数:{2, 3, 5} 次幂 {2, 1, 1} => (2*2)*(3*1)*(5*1) = 60。我现在有以下代码来确定素数数组中的重复项,但是我现在如何不将它们打印到控制台,而是将它们保存在另一个变量中,然后将它们用于幂数组?long current = primes[0];boolean found = false;for( int i = 0; i < primes.length; i++) {   if( current == primes[i] && !found) {      found = true;   }   else if( current != primes[i] ) {      System.out.print(" " + current);      current = primes[i];      found = false;   } 完整的代码将是:public class Algebra {public static long [][] primfaktorzerlegung(long n){    int position = 0;    long[] primes = new long [0];    long [] powers = new long [0];    while(n%2 == 0) {        primes[position] = 2;        position++;        n = n / 2;    }    for (int i = 3; i <= Math.sqrt(n); i+= 2)    {        while (n%i == 0)        {            n /= i;        }    }    long current = primes[0];    boolean found = false;    for (int i = 0; i < primes.length; i++) {        if (current == primes[i] && !found) {            found = true;        } else if (current != primes[i]) {            current = primes[i];            found = false;        }    }    long[][] z = {primes,powers};    return z;    }}这显然是未完成的,但为了展示整个内容,我还是发布了它。
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

您想要每个素数的频率,并且在 java 中有一种标准方法可以做到这一点。此外,由于您不知道会有多少个素数,所以最好使用列表。


但是您甚至不需要使用其中任何一个,只需使用 aMap<Long, Long>并在一次通过中累积素数和幂:


Map<Long, Long> primePowers = new LinkedHashMap<>();

for (int i = 2; i <= Math.sqrt(n); i+= 2) {

    while (n%i == 0) {

        primePowers.put(i, primePowers.getOrDefault(i, 0L) + 1);

        n /= i;

    }

}


// convert the Map to the return value

long[] primes, powers = new long[primePowers.size()];

int i = 0;

for (Map.Entry<Long, Long> entry : primePowers.entrySet()) {

    primes[i] = entry.getKey();

    powers[i] = entry.getValue();

}


return new long[][]{primes,powers};

仅供参考 aLinkedHashMap以插入顺序迭代其条目。


作为设计点,返回类型long[][]不是一个好的选择。任何两个数组必须就其元素对齐达成一致的情况都是糟糕的设计。


查看完整回答
反对 回复 2022-01-12
?
波斯汪

TA贡献1811条经验 获得超4个赞

代码:


import java.util.ArrayList;

import java.util.List;


public class Primes {


   static long getPowerOf( long power, long n, List<Long> primes, List<Long> powers ) {

      if(( n % power ) == 0 ) {

         long count = 0L;

         while(( n % power ) == 0 ) {

            ++count;

            n = n / power;

         }

         primes.add( power );

         powers.add( count );

      }

      return n;

   }


   static long[][] getPrimes( long n ) throws Exception {

      final List<Long> primes = new ArrayList<>();

      final List<Long> powers = new ArrayList<>();

      n = getPowerOf( 2, n, primes, powers );

      for( long i = 3; n > 1; i += 2 ) {

         n = getPowerOf( i, n, primes, powers );

      }

      if( n > 1 ) {

         throw new Exception( "More primes needed" );

      }

      final long[][] result = new long[2][];

      result[0] = new long[primes.size()];

      result[1] = new long[powers.size()];

      for( int i = 0; i < primes.size(); ++i ) {

         result[0][i] = primes.get( i );

      }

      for( int i = 0; i < powers.size(); ++i ) {

         result[1][i] = powers.get( i );

      }

      return result;

   }


   static void showPrimes( long[] primes, long[] powers ) {

      boolean tail = false;

      for( int i = 0; i < primes.length; ++i ) {

         if( powers[i] > 0 ) {

            if( tail ) {

               System.out.print( " + " );

            }

            else {

               tail = true;

            }

            System.out.print( primes[i] + "x" + powers[i]);

         }

      }

      System.out.println();

   }


   public static void main( String[] args ) throws Exception {

      final long[][] result = getPrimes( 2*2*3*5*5*7*23*23*23 );

      showPrimes( result[0], result[1] );

   }

}

输出:


2x2 + 3x1 + 5x2 + 7x1 + 23x3

笔记:


使用类代替long[][]for primes 和 powers 会更好,如下所示:


class PrimeUsage {

   long prime;

   long power;

}


PrimeUsage[] or List<PrimeUsage> or Set<PrimeUsage>


查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信