Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 程序在执行时挂起_C#_Algorithm_Console - Fatal编程技术网

C# 程序在执行时挂起

C# 程序在执行时挂起,c#,algorithm,console,C#,Algorithm,Console,我有一个问题,我的程序执行,然后只是挂起在执行过程中的某个地方。我基本上想知道是什么原因造成的 for (long i = maxNumber; i > 2; i--) { IsPrime = true; for (long g = 2; g < i; g++) { long temp = i % g; if (temp == 0) { IsPrime = false;

我有一个问题,我的程序执行,然后只是挂起在执行过程中的某个地方。我基本上想知道是什么原因造成的

for (long i = maxNumber; i > 2; i--)
{
    IsPrime = true;
    for (long g = 2; g < i; g++)
    {
        long temp = i % g;
        if (temp == 0)
        {
            IsPrime = false;                            
            break;
        }
    }
    if (IsPrime == true)
    {
        largestPrimeFactor = i;                        
        break;
    }
}
for(长i=maxNumber;i>2;i--)
{
IsPrime=true;
对于(长g=2;g
这个算法可能没有挂起。根据
maxnumber
的值,循环可能需要很长时间。

此算法可能不会挂起。根据
maxnumber
的值,可能需要很长时间才能通过循环。

如果我尝试正确,您的代码将试图找到0和maxnumber之间的最大素数。使用Eratosthenes筛子查找0和maxNumber平方根之间的所有素数。然后,你可以从maxNumber迭代到0,得到一个被你刚刚找到的所有素数都不可分的数

编辑: 试过这个

            var sqrtMax = (int)Math.Sqrt(maxNumber);
            var primeCandidates = Enumerable.Range(2, sqrtMax-1)
             .ToDictionary(number => number, isComposite => false);

            foreach (var number in primeCandidates.Keys.ToArray())
            {
                if (primeCandidates[number])
                {
                    continue;
                }
                Parallel.ForEach(Enumerable.Range(2, sqrtMax / number - 1).Select(times => number * times),multiples=>
                    primeCandidates[multiples] = true);
            }
            var primeList = primeCandidates.Where(number => !number.Value).Select(pair=>pair.Key).ToArray();
            var maxPrime = maxNumber;


            while (primeList.AsParallel().Any(prime=> maxPrime%prime==0))
            {
                maxPrime--;
            }

对于maxNumber=600881475134,它可以在不到3秒内找到maxPrime(并行化是因为我认为这需要很长时间)

如果我尝试正确,您的代码将试图找到0和maxNumber之间的最大素数。使用Eratosthenes筛子查找0和maxNumber平方根之间的所有素数。然后,你可以从maxNumber迭代到0,得到一个被你刚刚找到的所有素数都不可分的数

编辑: 试过这个

            var sqrtMax = (int)Math.Sqrt(maxNumber);
            var primeCandidates = Enumerable.Range(2, sqrtMax-1)
             .ToDictionary(number => number, isComposite => false);

            foreach (var number in primeCandidates.Keys.ToArray())
            {
                if (primeCandidates[number])
                {
                    continue;
                }
                Parallel.ForEach(Enumerable.Range(2, sqrtMax / number - 1).Select(times => number * times),multiples=>
                    primeCandidates[multiples] = true);
            }
            var primeList = primeCandidates.Where(number => !number.Value).Select(pair=>pair.Key).ToArray();
            var maxPrime = maxNumber;


            while (primeList.AsParallel().Any(prime=> maxPrime%prime==0))
            {
                maxPrime--;
            }

对于maxNumber=600881475134,它在不到3秒内找到maxPrime(并行化是因为我认为它需要很长时间)

您的程序挂起,因为您发布的循环正在使用它的线程。这意味着在循环完成之前,您不能执行任何其他命令。
如果要防止这种行为,请使用不同的线程来执行代码


不同的算法可能会提高性能,但最终您仍会遇到“挂起”,具体取决于执行所需的时间。

您的程序“挂起”,因为您发布的循环正在使用它的线程。这意味着在循环完成之前,您不能执行任何其他命令。
如果要防止这种行为,请使用不同的线程来执行代码


不同的算法可能会提高性能,但最终您仍会遇到“挂起”,具体取决于执行所需的时间。

何时挂起的输入?我没有仔细看,但你确定这不是花很长时间吗?O(N^2)对于足够大的N来说是非常长的。
maxNumber
的值是多少?埃拉托什尼筛:确实慢,而且越大的maxNumber越慢。该算法是N平方的,这意味着对于10个数字,它会进行大约100次测试,但是对于1000个数字,它会进行大约100万次测试,以此类推!在第一个for条件中,应将其更改为:for(长g=2;g*gmaxNumber的值是多少?埃拉托什尼筛:确实慢,而且越大的maxNumber越慢。该算法是N平方的,这意味着对于10个数字,它会进行大约100次测试,但是对于1000个数字,它会进行大约100万次测试,以此类推!在第一个for条件中,应将其更改为:for(长g=2;g*g