编程语言
首页 > 编程语言> > C#练习题答案: 连续k-Primes【难度:3级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战

C#练习题答案: 连续k-Primes【难度:3级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战

作者:互联网

连续k-Primes【难度:3级】:

答案1:

using System;

class PrimeConsec 
{
    
    private static int countPrimeDiv(long n) 
    {
        int cnt = 0;
        for (long i = 2; i * i <= n; i++) 
        {
            while (n % i == 0) 
            {
                cnt++;
                n /= i;
            }
        }
        if (n > 1) cnt++;
        return cnt;
    }
    public static int ConsecKprimes(int k, long[] arr) 
    {
        int cnt = 0;
        for (int i = 0; i < arr.Length - 1; ++i)
            if ((countPrimeDiv(arr[i]) == k) &amp;&amp; (countPrimeDiv(arr[i+1]) == k))
                cnt += 1;
        return cnt;
    }
}
​

答案2:

using System;
class PrimeConsec 
{
    
    public static int ConsecKprimes(int k, long[] arr)
        {
            int len = arr.Length;
            bool[] factorK = new bool[len];
            for (int i = 0; i < len; i++)
            {
                factorK[i] = IsFactorK(arr[i], k);
            }
            int result = 0;
            for (int i = 0; i < len - 1; i++)
            {
                if (factorK[i] &amp;&amp; factorK[i+1])
                {
                    result++;
                }
            }
            return result;
        }
        public static bool IsFactorK(long num, int k)
        {
            int factor = 0;
            double upperBound = Math.Sqrt(num) + 1;
            for (int i = 2; i < upperBound; i++)
            {
                if (num == 1) break;
                while (num % i == 0)
                {
                    num /= i;
                    factor++;
                    if (factor > k)
                    {
                        return false;
                    }
                }
            }
            if (num != 1)
            {
                factor++;
            }
            return factor == k;
        }
}​

答案3:

using System;
using System.Linq;

class PrimeConsec 
{
    
    public static int ConsecKprimes(int k, long[] arr) 
    {
      bool[] kPrimes = arr.Select((x) => IsKPrime(k, x)).ToArray();
      int result = 0;
      
      for (int i = 1; i < kPrimes.Length; i++) {
        if (kPrimes[i-1] &amp;&amp; kPrimes[i]) {
          result++;
        }
      }
      
      return result;
    }
    
    public static bool IsKPrime(int k, long n) {
      if (k == 1) {
        return IsPrime(n);
      }
  
      int limit = (int) Math.Ceiling(Math.Pow(n, 1.0 / k));
      for (int i = 2; i <= limit; i++) {
        if (IsPrime(i) &amp;&amp; n % i == 0) {
          return IsKPrime(k - 1, (int) Math.Round((double) n/i));
        }
      }
      
      return false;
    }
    
    public static bool IsPrime(long n) {
      if (n == 1) {
        return false;
      }

      if (n == 2) {
        return true;
      }

      int limit = (int) Math.Ceiling(Math.Sqrt(n));
      for (int i = 2; i <= limit; i++) {
        if (n % i == 0) {
          return false;
        }
      }
    
      return true;
    }
}​

答案4:

using System;
class PrimeConsec 
{
    
    public static int ConsecKprimes(int k, long[] arr) 
    {
        long[] primeFactors = new long[arr.Length];
        for (int counter = 0 ; counter < arr.Length ; counter++){
            primeFactors[counter] = 1;
            for (int count = 2 ; count*count<=arr[counter] ; count++){
                if (arr[counter] % count==0){
                    primeFactors[counter]++;
                    arr[counter]/=count;
                    count = 1;
                } 
            }
        }
        int result = 0 ;
        for (int counter = 1 ; counter < primeFactors.Length ; counter++){
            if (primeFactors[counter]==k &amp;&amp; primeFactors[counter]==primeFactors[counter-1] )
                result++;
        }
        return result;
    }
}​

答案5:

using System.Collections.Generic;
class PrimeConsec 
{
    // p is list of primes. 
    // We will use, that all primes after 3 always are 6k +- 1 
    static int[] r = {1, 7, 11, 13, 17, 19, 23, 29};
    static List<int> p = new List<int>();
        
    static bool IsPrime(int num)
    {
        foreach(int d in p)
            if(num % d == 0)
                return false;
        return true;
    }
        
    public static int ConsecKprimes(int k, long[] arr) 
    {
        p.Add(7);
        p.Add(11);
        p.Add(13);
        p.Add(17);
        p.Add(19);
        p.Add(23);
        p.Add(29);
        for(int x = 30; x<=20000; x+=30)
        {
            foreach(int y in r)
            {
                int num = x+y;
                
                if(IsPrime(num))
                    p.Add(num);
            }
        }
        //optimization 
        p.Add(2);
        p.Add(3);
        p.Add(5);
    
        bool[] b = new bool[arr.Length]; // b[i] means arr[i] is k-Prime
        for(int i=0; i<arr.Length; i++)
        {
            int c =0;
            foreach(int prime in p)
                while(arr[i] % prime ==0)
                {
                    arr[i] /= prime;
                    c++;
                }
                
                // with Eratosphen algorythm - all "big" nubers are prime here
                if(arr[i]>1)
                  c++; 
            
            b[i] = c == k;
        }
     
        int count = 0;
        for(int i=1; i<b.Length; i++)
            if(b[i-1] &amp;&amp; b[i])
                count ++;
        return count;
    }
}​

答案6:

using System.Linq;

public class PrimeConsec {
    public static int ConsecKprimes( int k, long[] arr ) {
        var count = 0;
        var factors = arr.Select( GetFactorsCount ).ToArray( );

        for ( int i = 1; i < factors.Length; i++ ) {
            if ( factors [ i - 1 ] == k &amp;&amp; factors [ i ] == k ) {
                count += 1;
            }
        }
        return count;
    }

    private static int GetFactorsCount( long n ) {
        var result = 0;
        long factor = 2;
        while ( factor*factor <= n ) {
            while ( n%factor == 0 ) {
                result += 1;
                n /= factor;
            }
            factor += 1;
        }
        if ( n > 1 ) {
            result += 1;
        }
        return result;
    }
}​

答案7:

class PrimeConsec 
{
    
    public static int Factorize(long n){
                int x = 0;
                for (int d=2; n>1; d++){
                    while (n%d==0){
                        x++;
                        n /= d;
                    }
                }
                return x;
            }

    public static int ConsecKprimes(int k, long[] arr) {
                int prev = Factorize(arr[0]);
                int res = 0;
                for (int i=1; i<arr.Length; i++) {
                    int cur = Factorize(arr[i]);
                    if (cur==prev &amp; cur==k) {
                        res++;
                    }
                    prev = cur;
                }
                return res;
            }
}​

答案8:

class PrimeConsec
{
    public static int ConsecKprimes(int k, long[] arr)
    {
        int count=0;
        for (int i=0; i<arr.Length-1; ++i)
        {
            if (Prime(arr[i]) != k || Prime(arr[i+1]) != k) continue;
            ++count;
        }
        return count;

    }
    
    public static int Prime(long n)
    {
        int count=0;
        for (long i=2; i*i<=n; ++i)
        {
            while (n%i==0)
            {
                ++count;
                n/=i;
            }
        }
        
        if (n>1) count++;
        return count;
    }
}​

答案9:

using System.Collections.Generic;
using System;
class PrimeConsec 
{
    
    public static int ConsecKprimes(int k, long[] arr) 
    {
      List<int> primeFactors=new List<int>();
      int consecutive=0;
      
      foreach (long num in arr) GetK(num);
      
      //This counts how many times any prime number can be factored out of toTest.  
      //It logs that number in primeFactors.
      void GetK(long toTest){
        int n=0;
        while (toTest>1){
          for (int i=2;i<=toTest;i++){
            if (toTest%i==0){
              n++;
              toTest/=i;
              break;
            }
          }
        }
        primeFactors.Add(n);
      }
      
      //This counts how many times a number in primeFactors is equal to the next number in the list
      //It omits cases where the entry is not 'k' in order to only count consecutive k-prime numbers
      for (int i=0;i<primeFactors.Count-1;i++){
        if (primeFactors[i]==primeFactors[i+1]&amp;&amp;primeFactors[i]==k) consecutive++;
      }
      
      return consecutive;
    
    
    
    }
}​

标签:练习题,arr,return,景越,C#,++,long,int,static
来源: https://blog.csdn.net/weixin_45444821/article/details/100750758