如何在不使用乘法(*)符号的情况下乘以十进制数

时间:2013-10-01 13:22:19

标签: c#

任何人都可以建议我在不使用乘法(*)符号的情况下乘以十进制数。 我知道它看起来像家庭作业,但我只是想知道如何实现这一目标。我已经为正负整数做了这个,如下所示:

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;

由于

5 个答案:

答案 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));

它并不适用于所有小数(特别是不适用于负数,尽管它可以扩展为检测这些并解决它们),但它仍然很有趣。