Cette réponse ...
int penaltySum(int a, int b)
{
return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
échoue le test suivant:
[TestMethod]
public void PenaltySumTest()
{
int x = -200000;
int y = 200000;
int z = 0;
Assert.AreEqual(z, penaltySum(x, y));
}
Je suggère la mise en œuvre penaltySum() comme suit:
private int penaltySum(int x, int y, int max)
{
long result = (long) x + y;
return result > max ? max : (int) result;
}
Avis Je passe la valeur maximale, mais vous pouvez hardcode dans le Int.MaxValue si vous souhaitez.
Sinon, vous pouvez forcer la vérification de débordement d'opération arithmétique et procédez comme suit:
private int penaltySum(int x, int y, int max)
{
int result = int.MaxValue;
checked
{
try
{
result = x + y;
}
catch
{
// Arithmetic operation resulted in an overflow.
}
}
return result;
}
Merci d'avoir souligné mon oubli. J'ai mis à jour mon exemple pour inclure une option pour les pénalités négatives. –
En ce qui concerne vos options, les deux fonctionnent, mais je pense toujours que la méthode que j'ai fournie est supérieure. Votre première technique n'est pas générale, car elle nécessite qu'un type plus grand soit disponible. Votre seconde technique utilise des exceptions, donc je ne crois pas qu'elle répond à l'exigence de "l'efficacité" spécifiée par Tomas. –