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

在数字素数【难度:3级】:

答案1:

using System;
using System.Collections.Generic;

public class PrimeDecomp {
  public static String factors(int lst) {
    var primes = new List<string>();
    for (var number = 2; number <= lst; number++)
    {
      var count=0;
      while (lst % number == 0) { count++; lst /= number; }                
      if(count==0) continue;
      primes.Add( String.Format(count > 1 ? "({0}**{1})" : "({0})",number,count));
    }
    return String.Join("", primes);
  }
}

答案2:

using System.Collections.Generic;
using System.Linq;

public static class PrimeDecomp
{
  public static string factors(int number)
  {
    return string.Join("", GenerateFactors(number).GroupBy(n => n).FormatGroups());
  }

  public static IEnumerable<int> GenerateFactors(int number)
  {
    foreach (var factor in _generateFactorCandidates())
    {
      if (factor * factor > number)
      {
        if (number != 1)
          yield return number;
        yield break;
      }
      
      while (number % factor == 0)
      {
        yield return factor;
        number /= factor;
      }        
    }
  }
 
  private static IEnumerable<int> _generateFactorCandidates()
  {
    yield return 2;
    yield return 3;
    yield return 5;
    
    var candidate = 1;
    while (true)
    {
      foreach (var jump in new [] { 6, 4, 2, 4, 2, 4, 6, 2 })
      {
        candidate += jump;
        yield return candidate;
      }
    }
  }
  
  private static IEnumerable<string> FormatGroups(this IEnumerable<IGrouping<int, int>> groups)
  {
    foreach (var g in groups)
    {
      var count = g.Count();
      var exponent = count == 1 ? "" : "**" + count;
      var formatted = string.Format("({0}{1})", g.Key, exponent);
      
      yield return formatted;
    }
  } 
}

答案3:

using System;
using System.Linq;
using System.Collections.Generic;

public class PrimeDecomp {

  public static String factors(int lst) {
    var del = new List<int>();
    var i = 2;
    while(lst != 1)
    {
        if (lst % i == 0)
        {
           del.Add(i);
           lst = lst / i;
        }
        else
        {
            i++;
        }
    }
    return string.Join("", del.Select(x => "(" + (del.Count(y => y == x) > 1 ? x + "**" + del.Count(y => y == x) : x.ToString()) + ")").Distinct());
  }
}

答案4:

using System;
public class PrimeDecomp {

  public static String factors(int lst) {
    string result = String.Empty;
    int c=0;
    for (int i=2; i<=lst &amp;&amp; lst>1; i++,c=0)
    {
      for (c=0; lst > 1 &amp;&amp; lst % i == 0; c++ )  lst/=i;
      result += (c > 0) ? ( c==1 ? "(" + i.ToString() + ")" : "(" + i.ToString() + "**" + c.ToString() + ")"  )   
                : String.Empty;
    }
    return result;
  }
}

答案5:

using System;
using System.Text;

public class PrimeDecomp {

  public static String factors(int lst) {
    StringBuilder result = new StringBuilder();
  
    for(int factor=2; factor <= lst; factor++)
    {
        int factorCount = CountFactor(lst, factor);
        lst = ReduceNumber(lst, factor, factorCount);                
        result.Append(FormatFactor(factor, factorCount));
    }
    
    return result.ToString();
  }
  
  private static int CountFactor(int lst, int factor)
  {
    int count = 0;
    while( (factor <= lst) &amp;&amp; (lst % factor == 0) )
    {
      lst /= factor;
      count++;
    }
    return count;
  }
  
  private static int ReduceNumber(int lst, int factor, int count)
  {
    for(int i=0;i<count;i++)
    {
      lst /= factor;
    }
    
    return lst;
  }
  
  private static string FormatFactor(int factor, int count)
  {
    if(count == 1)    
      return $"({factor})";        
    else if(count > 1)    
      return  $"({factor}**{count})";
    
    return "";
  }
}

答案6:

using System;
using System.Collections.Generic;
using System.Text;


public class PrimeDecomp
{
    public static String factors(int lst)
    {
        var collection = new Dictionary<int, int>();
        foreach (var factor in FindFactors(lst))
        {
            if (!collection.ContainsKey(factor))
                collection[factor] = 1;
            else
                collection[factor]++;
        }

        var stringBuilder = new StringBuilder();
        foreach (var item in collection)
            stringBuilder.Append(item.Value > 1 ? $"({item.Key}**{item.Value})" : $"({item.Key})");

        return stringBuilder.ToString();
    }

    public static IEnumerable<int> FindFactors(int num)
    {
        var result = new List<int>();

        // Take out the 2s.
        while (num % 2 == 0)
        {
            result.Add(2);
            num /= 2;
        }

        // Take out other primes.
        var factor = 3;
        while (factor * factor <= num)
        {
            if (num % factor == 0)
            {
                // This is a factor.
                result.Add(factor);
                num /= factor;
            }
            else
            {
                // Go to the next odd number.
                factor += 2;
            }
        }

        // If num is not 1, then whatever is left is prime.
        if (num > 1)
            result.Add(num);

        return result;
    }
}

答案7:

using System;
using System.Text;

public class PrimeDecomp {

  public static String factors(int num) {
      StringBuilder res = new StringBuilder();
      for (int b = 2; num > 1; b++)
        if (num % b == 0)
        {
          int x = 0;
          while (num % b == 0)
          {
            num /= b;
            x++;
          }
          res.AppendFormat((x == 1) ? "({0})" : "({0}**{1})", b, x);
        }
      return res.ToString();
  }
}

答案8:

    using System.Collections.Generic;
    using System.Linq;
    using System;


public class PrimeDecomp {

        public static IEnumerable<int> EnumerPrimes() {
            for (var n = 2; n < 1000000; n++) {
                var isPrime = true;
                for (var p = 2; p*p <= n; p++) {
                    if (n%p == 0) {
                        isPrime = false;
                        break;
                    }
                }
                if (isPrime) {
                    yield return n;
                }
            }
        }

        private static IEnumerable<int> GetPrimes(int lst) {
            foreach (var p in EnumerPrimes()) {
                while (lst % p == 0) {
                    lst = lst / p;
                    yield return p;
                }
                if (lst == p) {
                    yield break;
                }
            }
        }

        public static string factors(int lst) {
            var seq = GetPrimes(lst).GroupBy(i => i)
                .Select(g => g.Count() > 1 ? $"({g.Key}**{g.Count()})" : $"({g.Key})");

            return string.Concat(seq);
        }
}

答案9:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class PrimeDecomp
{
    static List<int> GetPrimes(int n)
    {
        bool[] isPrime = Enumerable.Repeat(true, n + 1).ToArray();
        int sqrtOfN = (int)Math.Sqrt(n);
        for (int i = 2; i < sqrtOfN; i++)
            if (isPrime[i])
                for (int j = i * i; j <= n; j += i)
                    if (isPrime[j])
                        isPrime[j] = false;
        List<int> primes = new List<int>();
        for (int i = 2; i <= n; i++)
            if (isPrime[i])
                primes.Add(i);
        return primes;
    }
    public static string factors(int lst)
    {
        int sqrtOfLst = (int)Math.Sqrt(lst);
        List<int> primes = GetPrimes(sqrtOfLst);
        Dictionary<int, int> countByPrime = new Dictionary<int, int>();
        foreach (int prime in primes)
            if (lst % prime == 0)
            {
                countByPrime.Add(prime, 1);
                lst /= prime;
                while (lst % prime == 0)
                {
                    countByPrime[prime]++;
                    lst /= prime;
                }
            }
        StringBuilder result = new StringBuilder();
        foreach (int prime in countByPrime.Keys)
            if (countByPrime[prime] == 1)
                result.Append("(" + prime + ")");
            else
                result.Append("(" + prime + "**" + countByPrime[prime] + ")");
        if (lst != 1)
            result.Append("(" + lst + ")");
        return result.ToString();
    }
}

答案10:

public class PrimeDecomp {

  public static string factors(int lst) {
    
    int[] primes = {2,3,5,7,11,13,17,19,23,29,31,37,41};
    int[] counts = {0,0,0,0,0,0,0,0,0,0,0,0,0};
    int i = 0;
    string result = "";
    string final = "";
    
    while (i < primes.Length)
    {
      if (lst%primes[i] == 0)
      {
        counts[i]++;
        lst = lst/primes[i];
      }
      else
      {
          i++;
      }
    }
    
    
    for (int j = 0; j < counts.Length; j++)
    {
      switch (counts[j])
      {
        case 0:
          continue;
        case 1:
          result += "(" + primes[j] + ")";
          break;
        default:
          result += "(" + primes[j] + "**" + counts[j] + ")";
          break;
      }
    }
    
    int start = 43;
    while (lst > 1)
    {
        if (lst%start == 0)
        {
          final += "(" + start + ")";
          lst = lst/start;
          continue;
        } 
        
        start += 2;

    }
    
    
    return result+final;
  }
  
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值