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