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) && (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] && 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] && 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) && 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 && 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] && 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 && 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 & 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]&&primeFactors[i]==k) consecutive++;
}
return consecutive;
}
}
标签:练习题,arr,return,景越,C#,++,long,int,static 来源: https://blog.csdn.net/weixin_45444821/article/details/100750758