任何人都可以建议我在不使用乘法(*)符号的情况下乘以十进制数。 我知道它看起来像家庭作业,但我只是想知道如何实现这一目标。我已经为正负整数做了这个,如下所示:
int first = 2;
int second =2;
int result = 0;
bool isNegative = false;
if (first < 0)
{
first = Math.Abs(first);
isNegative = true;
}
if (second < 0)
{
second = Math.Abs(second);
isNegative = true;
}
for (int i = 1; i <= second; i++)
{
result += first;
}
if (isNegative)
result = -Math.Abs(result);
想要将其乘以小数:
decimal third = 1.1;
decimal fourth = 1.2;
由于
答案 0 :(得分:12)
作弊,但如果任务严格涉及所有形式的乘法(而不仅仅是*
运算符),则除以倒数:
var result = first / (1 / (decimal)second);
答案 1 :(得分:6)
另一种方式;)
if (second < 0)
{
second = Math.Abs(second);
first = (-1) * first;
}
result = Enumerable.Repeat(first, second).Sum();
答案 2 :(得分:2)
不使用*运算符的两位小数的最简单方法是使用Decimal.Multiply方法。
示例:
decimal first = -2.234M;
decimal second = 3.14M;
decimal product = Decimal.Multiply(first, second);
答案 3 :(得分:1)
严格没有'*'?我注意到实现了XOR运算符。虽然我知道这个代码与OP没什么不同。
int first = 2;
int second =2;
int result = 0;
bool isNegative;
isNegative = (first<0)^(second<0);
first = (first<0)?Math.Abs(first):first;
second = (second<0)?Math.Abs(second):second;
for (int i = 1; i <= second; i++)
result += first;
result = (isNegative)?-Math.Abs(result):result;
答案 4 :(得分:0)
为了完整起见,这是使用日志规则的另一种方法:
decimal result = (decimal)Math.Exp(
Math.Log((double)third) + Math.Log((double)fourth));
它并不适用于所有小数(特别是不适用于负数,尽管它可以扩展为检测这些并解决它们),但它仍然很有趣。