我刚刚创建了一个非常快速的素数排序方法.如何改进?

I just created an extremely fast way to sort primes. How do I improve it?

本文关键字:排序 何改进 方法 非常 创建 一个      更新时间:2023-10-16

基本上,它的工作原理是将一个数字转换为一个字符串,如果它在字符串中找到任何数字,那么它会给foundEven变量一个正值。奇数也是如此。

(我不明白的一件事是,为什么如果我将">"符号与if (FoundEvenSignedInt < FoundOddSignedInt)中的"<"切换,它会给你一个奇数的正确结果。

有什么方法可以改进代码吗?里面有什么错误吗?我对C++编程相当陌生。

#include <string>
#include <cstddef>
int IsPrime(long double a)
{
int var;
long double AVar = a;
signed int FoundEvenSignedInt, FoundOddSignedInt;
std::string str = std::to_string(a);
std::size_t foundEven = str.find_last_of("2468");
std::size_t foundOdd = str.find_last_of("3579");
FoundEvenSignedInt = foundEven;
FoundOddSignedInt = foundOdd;
if (FoundEvenSignedInt < FoundOddSignedInt)
{
var = 1;
goto EndOfIsPrimeFunction;
}
if (FoundEvenSignedInt > FoundOddSignedInt)
{
var = 2;
goto EndOfIsPrimeFunction;
}
// This if statement kept giving me this weird warning so I made it like this
if (FoundEvenSignedInt == -1)
{
if (FoundOddSignedInt == -1)
{
if (AVar == 10 || 100 || 1000 || 10000 || 100000 || 1000000)
{
var = 2;
goto EndOfIsPrimeFunction;
}
}
}
EndOfIsPrimeFunction:
return var;
}

以下是一些改进代码的方法。

  1. 科拉茨猜想是关于整数的。long double是浮点数的数据类型。它不适合检查猜想。您需要使用整型数据类型,例如unsigned long long。如果这没有足够的范围适合您,则需要使用某种 Bignum dat atype。标准 C 库中没有任何,您需要找到第三方库。
  2. 科拉茨猜想与素数无关。它是关于偶数和奇数的整数。的确,除了 2 之外的所有素数都是奇数,但这一事实对您没有帮助。
  3. 在C++中回答是/否问题的数据类型为bool。按照惯例。对于任何其他数字数据类型,零表示"否",所有其他值表示"是"(从技术上讲,当转换为bool时,零将转换为false,其他值将转换为true,因此您可以执行类似if (a % 2)的操作。为yesno返回12的函数是非常规的。
  4. 检查数字是否为奇数的自然方法是:

    bool isOdd (unsigned long long a) 
    {
    return a % 2;
    }
    

    它比你的代码快一些(在我的电脑上大约是 400 倍),每次都给出正确的结果,可读性强,并且语句goto为零。

而不是if(AVar == 10 || 100 || ...,你可以说if(!(AVar % 10))