Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 - Fatal编程技术网

C# 将一个数字拆分为多个数字

C# 将一个数字拆分为多个数字,c#,algorithm,C#,Algorithm,下面是一个例子: 我们有一名员工的总工作时间。小时数为10小时 正常限制为8小时。超出这个数额的称为加班 正常工作时间=8小时,加班时间=2小时。所以我们把10号分成8号和2号 这是我的实现,请原谅我的C: 请注意,如果我们想将一个数字拆分为两个以上的数字,那么最终会出现多个复杂的if块,代码看起来会很模糊 有没有更优雅的方法来处理这个问题?您可以通过使用Math.Min方法选择一对数字中的较低者,使用Math.Max方法选择较高者来避免if/else set { // The act

下面是一个例子:

我们有一名员工的总工作时间。小时数为10小时

正常限制为8小时。超出这个数额的称为加班

正常工作时间=8小时,加班时间=2小时。所以我们把10号分成8号和2号

这是我的实现,请原谅我的C:

请注意,如果我们想将一个数字拆分为两个以上的数字,那么最终会出现多个复杂的if块,代码看起来会很模糊


有没有更优雅的方法来处理这个问题?

您可以通过使用Math.Min方法选择一对数字中的较低者,使用Math.Max方法选择较高者来避免if/else

set 
{
    // The actual value or the configured limit, whichever is lower.
    dailyStatements[index].Normal = Math.Min(value, _config.NormalLimit); 
    // The hours over the limit, or 0 if it comes out negative);
    dailyStatements[index].Overtime = Math.Max(value - _config.NormalLimit, 0) 
}

通过使用Math.Min方法选择一对数字中的较低值,使用Math.Max方法选择较高值,可以避免if/else

set 
{
    // The actual value or the configured limit, whichever is lower.
    dailyStatements[index].Normal = Math.Min(value, _config.NormalLimit); 
    // The hours over the limit, or 0 if it comes out negative);
    dailyStatements[index].Overtime = Math.Max(value - _config.NormalLimit, 0) 
}

正如在评论中所讨论的,我们可以制作一个工作时间板块数组,并为这些时间内每小时的付款率制作另一个数组。请注意,您还可以为此创建一个类,以便在工作时间和付款率之间建立更紧密的绑定

class Solution {
    static void Main() {
        int[] working_hours = new int[]{8,2,15};
        int[] payment_rate = {100,150,200};
        int payment_per_hour = 500;

        for(int i=1;i<=15;++i){
            System.Console.WriteLine("Payment for " + i + " hour(s) worked: $"+ totalPayment(i,working_hours,payment_rate,payment_per_hour));
        }
    }

    private static int totalPayment(int hours_worked,int []working_hours,int []payment_rate,int payment_per_hour){
        int amount = 0;
        for(int i=0;i<working_hours.Length;++i){
            int curr_slab = Math.Min(hours_worked,working_hours[i]);
            amount += curr_slab * (payment_per_hour * payment_rate[i] / 100);
            hours_worked -= curr_slab;            
            if(hours_worked == 0) break;
        }

        return amount;
    }
}

我们计算候选人的工作小时数,然后从我们的工作平板中减去它,同时还将根据特定工作平板的工作小时率支付的金额相加

如评论中所述,我们可以制作一个工作时间板块数组,以及该时段内每小时的付款率的另一个数组。请注意,您还可以为此创建一个类,以便在工作时间和付款率之间建立更紧密的绑定

class Solution {
    static void Main() {
        int[] working_hours = new int[]{8,2,15};
        int[] payment_rate = {100,150,200};
        int payment_per_hour = 500;

        for(int i=1;i<=15;++i){
            System.Console.WriteLine("Payment for " + i + " hour(s) worked: $"+ totalPayment(i,working_hours,payment_rate,payment_per_hour));
        }
    }

    private static int totalPayment(int hours_worked,int []working_hours,int []payment_rate,int payment_per_hour){
        int amount = 0;
        for(int i=0;i<working_hours.Length;++i){
            int curr_slab = Math.Min(hours_worked,working_hours[i]);
            amount += curr_slab * (payment_per_hour * payment_rate[i] / 100);
            hours_worked -= curr_slab;            
            if(hours_worked == 0) break;
        }

        return amount;
    }
}

我们计算候选人的工作小时数,然后从我们的工作平板中减去它,同时还将根据特定工作平板的工作小时率支付的金额相加

视情况而定,您的解决方案是相当有效的,尽管我也希望看到您得到。不过考虑一下,你是在谈论加班,是不是有点像时间下的事情?如果是这样的话,你可以跳过else,把它考虑进去,在1次计算中完成它。@Stefan我想用一个保持极限的集合,而不是通过FOR循环处理它。我现在正在绞尽脑汁。解释一下,如果我们想把一个数字分成两个以上的数字。加班时会有多少次拆分?@Stefan请原谅,我只是在本地玩C fiddle,还没有在get中编写业务逻辑。仅以该代码摘录为例。@vivek_23说得好。首先,为了避免折磨员工,让我们引入工作限制:15小时是最终限制。但是,让我们看看这个拆分算法,不管这个特定的业务上下文如何。没有员工,我们只是根据一组边界划分数字。在我们的例子中,小时数限制是集合中所有边界的总和,它是8+2+5=15。视情况而定,您的解决方案非常有效,尽管我也希望看到您的结果。不过考虑一下,你是在谈论加班,是不是有点像时间下的事情?如果是这样的话,你可以跳过else,把它考虑进去,在1次计算中完成它。@Stefan我想用一个保持极限的集合,而不是通过FOR循环处理它。我现在正在绞尽脑汁。解释一下,如果我们想把一个数字分成两个以上的数字。加班时会有多少次拆分?@Stefan请原谅,我只是在本地玩C fiddle,还没有在get中编写业务逻辑。仅以该代码摘录为例。@vivek_23说得好。首先,为了避免折磨员工,让我们引入工作限制:15小时是最终限制。但是,让我们看看这个拆分算法,不管这个特定的业务上下文如何。没有员工,我们只是根据一组边界划分数字。在我们的例子中,小时限制是集合中所有边界的总和,它是8+2+5=15。哇!这看起来非常简单和简洁,很好的解决方案,现在可以尝试一下了。而且,我想会有一系列限制,我们会根据这些限制生成新的数字。可能需要for循环。想…哇!这看起来非常简单和简洁,很好的解决方案,现在可以尝试一下了。而且,我想会有一系列限制,我们会根据这些限制生成新的数字。可能需要for循环。思考