区分字符串中的两个整数

时间:2017-11-12 18:52:33

标签: c# string primes

我遇到了一个问题我一直在努力确定给定字符串中的所有整数是否为素数(只能被1和它本身整除的数字)。

我为这个问题编写的逻辑已经完成并且正确,但在调试和测试代码时,我遇到了一个有趣的场景。

说我有以下字符串 This 15 i2s the45best str7ng 1n th3 w0r17ld

现在当上面的字符串在我的程序中运行时,它确定字符串中的素数是5, 2, 5, 7, 3, 7,这是正确的。但是,如果我希望我的程序检查15是否为素数而不是单独检查1是否为素数,然后检查5是否为素数,或者我想分别检查45而不是45的素数?

我还希望将此问题扩展到通常长度超过1位的数字。

以下是我完成我所描述的代码:

private static void Main(string[] args)
{
    string sentence = "This 15 i2s the45best str7ng 1n th3 w0r17ld";
    string primes = string.Empty;
    foreach(char c in sentence)
    {
        if (char.IsDigit(c))
        {
            if (isPrime(c - 48))
            {
                primes += c;
            }
        }
    }
    Console.WriteLine(primes.Length > 0 ? $"The prime numbers in\n\n\t{sentence}\n\nare {string.Join<char>(", ", primes)}" : $"There exist no primes in\n\n\t{sentence}");
    Console.ReadLine();
}

private static bool isPrime(int number)
{
    if(number == 3 || number == 2)
    {
        return true;
    }
    if(number % 2 == 0)
    {
        return false;
    }
    for(int i = 3; i < (int)Math.Sqrt(number); i++)
    {
        if(number % i == 0)
        {
            return false;
        }
    }
    return true;
}

2 个答案:

答案 0 :(得分:0)

让我们将问题分成两个较小的问题:

  1. Extract all integers from the string
  2. Check integer value if it is a prime one

第一个子任务可以借助正则表达式来解决:

  // IEnumerable<int> - we assume that all integers within the string are small enough.
  // If we can face an arbitrary integer sample12345678901234567890123456
  // BigInteger (instead of int) is the solution
  private static IEnumerable<int> ExtractIntValues(string source) {
    return Regex
     .Matches(source, "[0-9]+")
     .OfType<Match>()
     .Select(match => int.Parse(match.Value));
  }

第二个子任务可以实现为(您的代码略微优化)

  private static bool isPrime(int number) {
    if (number <= 1) // 0 and 1 are not primes
      return false;
    if (number % 2 == 0)
      return n == 2;

    int n = (int) (Math.Sqrt(number) + 0.5);

    for (int i = 3; i < n; i += 2) // we have to check odd divisors only
      if (number % i == 0)
        return false;

    return true;   
  } 

最后:

  string sentence = "This 15 i2s the45best str7ng 1n th3 w0r17ld";

  int[] primes = ExtractIntValues(sentence)
    .Where(number => IsPrime(number))
    .ToArray(); 

  Console.WriteLine($"string '{sentence}' contains {primes.Length} prime numbers: {string.Join(", ", primes)}"); 

答案 1 :(得分:0)

你可以这样做:

ServiceManager

请注意:
我采用了另一种'controllers' => [ 'factories' => [ Controller\VehiclesController::class => function($sm){ $vehiclesService=$sm->get('Application\Model\VehiclesTable'); return new Controller\VehiclesController($vehiclesService); } ], ], 方法,因为你的方法有问题。请在此处查看:IsPrime