C# 这是否可以进一步优化 publicstaticbool可分(双p,双n,双r,双k) { 双x=p; 双a=0.0,b=0.0,c=0.0; 虽然(x

C# 这是否可以进一步优化 publicstaticbool可分(双p,双n,双r,双k) { 双x=p; 双a=0.0,b=0.0,c=0.0; 虽然(x,c#,optimization,C#,Optimization,您的输入总是正整数吗?如果是这样,那么您可以使用int而不是double和使用整数除法而不是浮点除法来提高性能。然后您也不需要调用Math.Floor,因为整数除法会自动为您截断结果 您还可以将最后一行简化为: public static bool IsDivisible(double p, double n, double r, double k) { double x = p; double a = 0.0, b = 0.0, c = 0.0;

您的输入总是正整数吗?如果是这样,那么您可以使用
int
而不是
double
和使用整数除法而不是浮点除法来提高性能。然后您也不需要调用
Math.Floor
,因为整数除法会自动为您截断结果

您还可以将最后一行简化为:

public static bool IsDivisible(double p, double n, double r, double k)
    {
        double x = p;
        double a = 0.0, b = 0.0, c = 0.0;
        while (x <= n)
        {
            a += Math.Floor(n / x);
            if (x <= r)
                b += Math.Floor(r / x);
            if (x <= k)
                c += Math.Floor(k / x);
            x *= p;
        }
        return a > b + c ? true : false;
    }

您的输入总是正整数吗?如果是这样,那么您可以使用
int
而不是
double
,使用整数除法而不是浮点除法来提高性能。然后您也不需要调用
Math.Floor
,因为整数除法会自动为您截断结果

您还可以将最后一行简化为:

public static bool IsDivisible(double p, double n, double r, double k)
    {
        double x = p;
        double a = 0.0, b = 0.0, c = 0.0;
        while (x <= n)
        {
            a += Math.Floor(n / x);
            if (x <= r)
                b += Math.Floor(r / x);
            if (x <= k)
                c += Math.Floor(k / x);
            x *= p;
        }
        return a > b + c ? true : false;
    }

虽然这不是一个优化,
a>b+c
已经返回了您的方法应该返回的内容,所以您可以简单地执行
returna>b+c
我想在这里再添加一件事…您不能使用double进行计算,而是使用decimal类型。decimal将精确您的结果。还可以声明变量correctly-double a=0.0m;@DnshPly9我不认为切换到
decimal
将是一种优化。@marlon是的!这不是关于优化,而是关于精度。可能有更多的变化,=、<或其他条件与double的匹配不正确,而不是与decimal的匹配。在进行算术时,必须选择decimal模拟运算。例如,1.02+2.43在使用double时可能不等于3.45,而在使用decimal时将始终为3.45。在这种情况下,比较开始失败。这就是为什么decimal很好。绝对不会比double快。我不知道上面的代码中精度有多重要。:)@DnshPly9不,OP想要更快的代码。请阅读Mark Byers回答下面的注释。切换到
十进制
会更慢…不是数量级,而是更慢。这是朝着错误的方向发展。虽然这不是一个优化,
a>b+c
已经返回了您的方法应该返回的内容,所以您可以简单地执行
返回a>b+c
我想在这里再添加一件事……您不能使用double来进行计算,而是使用decimal类型。decimal将精确计算结果。还要正确声明变量-double a=0.0m;@DnshPly9我不认为切换到
decimal
将是一种优化。@marlon是的!这不是关于opt亚胺化,但关于精度。与十进制相比,=、<或其他条件与double的匹配可能会有更多的变化。在进行算术运算时,必须选择十进制。例如,使用double时,1.02+2.43可能不等于3.45,而使用decimal时,将始终为3.45。在这种情况下MParison开始失败。这就是为什么十进制是好的。肯定不会比double快。而且我不知道上面代码中的精度有多重要。@DnshPly9不,OP想要更快的代码。阅读Mark Byers回答下面的注释。切换到
十进制将更慢…不是数量级,但速度更慢。这就是标题g方向。好的。这样做。它可以进一步优化吗?或者更确切地说,任何其他编写代码的方法都可以使它运行得更快吗?ok。这样做。它可以进一步优化吗?或者更确切地说,任何其他编写代码的方法都可以使它运行得更快吗