我想在.NET中实现两个整数的乘法而不使用乘法运算符
public uint MultiplyNumbers(uint x, uint y)
{
}
任何想法!
答案 0 :(得分:25)
我认为这是家庭作业......否则你没有理所当然的想法。因此,我只是提示......
如果性能不是非常重要,请考虑x * 3 = x + x + x
...考虑使用循环。
如果性能很重要,但您知道一个的数字会很小,请在较小的数字上循环。
如果表现很重要并且两个数字都很大,那么你需要考虑一下比特。请记住x * 2
是x << 1
,并从那里开始。
答案 1 :(得分:12)
这违背了作业的精神,但是我会这样做才能踢......
创建自己的类,重载+运算符以进行乘法运算。
创建你的作业项目;添加您的第一个项目作为参考。写下你的代码
return new SuperInt(x) + SuperInt(y);
其他人都会对换位或加法进行一些变化。不管怎样,有一半孩子会发布Google搜索返回的完全代码。至少这样,你将是独一无二的。
任务本身实际上只是横向思维的练习。在.Net工作时,任何理智的人都会使用*运算符。
编辑:如果你真的想成为一个类小丑 - 重载*运算符并使用按位运算和添加来实现它。
附加答案#1 (如果您愿意更改方法签名......) 那怎么样?
static void Main(string[] args)
{
Console.WriteLine(string.Format("{0} * {1} = {2}", 5, 6, MultiplyNumbers(5, 6)));
Console.WriteLine(string.Format("{0} * {1} = {2}", -5, 6, MultiplyNumbers(-5, 6)));
Console.WriteLine(string.Format("{0} * {1} = {2}", -5, -6, MultiplyNumbers(-5, -6)));
Console.WriteLine(string.Format("{0} * {1} = {2}", 5, 1, MultiplyNumbers(5, 1)));
Console.Read();
}
static double MultiplyNumbers(double x, double y)
{
return x / (1 / y);
}
输出:
5 * 6 = 30
-5 * 6 = -30
-5 * -6 = 30
5 * 1 = 5
一条直接的代码行。
但是,如果采取这种方法,请准备好争论一下。它确实乘以整数;通过隐式将它们转换为调用中的双精度数。你的问题并没有说你只能使用 整数,只是它必须在不使用'*'的情况下乘以两个整数。
编辑:既然你说你不能改变MultiplyNumbers的签名 - 你可以不用这样做就完成它:
static uint MultiplyNumbers(uint x, uint y)
{
return MultiplyDouble(x, y);
}
static uint MultiplyDouble(double x, double y)
{
return Convert.ToUInt32(x / (1 / y));
}
附加答案#2 这是我最喜欢的方法。
获取值,将其发送给Google,解析结果。
static uint MultiplyNumbers(uint x, uint y)
{
System.Net.WebClient myClient = new System.Net.WebClient();
string sData = myClient.DownloadString(string.Format("http://www.google.com/search?q={0}*{1}&btnG=Search",x,y));
string ans = x.ToString() + " * " + y.ToString() + " = ";
int iBegin = sData.IndexOf(ans,50) + ans.Length ;
int iEnd = sData.IndexOf('<',iBegin);
return Convert.ToUInt32(sData.Substring(iBegin, iEnd - iBegin).Trim());
}
答案 2 :(得分:12)
看,马,没有*
运营商!
<击> 撞击>
<击>using System;
using System.Reflection.Emit;
static class Program
{
delegate uint UintOpDelegate(uint a, uint b);
static void Main()
{
var method = new DynamicMethod("Multiply",
typeof(uint), new Type[] { typeof(uint), typeof(uint) });
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Mul);
gen.Emit(OpCodes.Ret);
var del = (UintOpDelegate)method.CreateDelegate(typeof(UintOpDelegate));
var product = del(2, 3); //product is now 6!
}
}
击> <击> 撞击>
更好:
using System;
using System.Runtime.InteropServices;
delegate uint BinaryOp(uint a, uint b);
static class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool VirtualProtect(
IntPtr address, IntPtr size, uint protect, out uint oldProtect);
static void Main()
{
var bytes = IntPtr.Size == sizeof(int) //32-bit? It's slower BTW
? Convert.FromBase64String("i0QkBA+vRCQIww==")
: Convert.FromBase64String("D6/Ki8HD");
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
uint old;
VirtualProtect(handle.AddrOfPinnedObject(),
(IntPtr)bytes.Length, 0x40, out old);
var action = (BinaryOp)Marshal.GetDelegateForFunctionPointer(
handle.AddrOfPinnedObject(), typeof(BinaryOp));
var temp = action(3, 2); //6!
}
finally { handle.Free(); }
}
}
答案 3 :(得分:4)
您可以循环x
次,在每次迭代时将y
添加到正在运行的总计中。
答案 4 :(得分:4)
重复添加会起作用。将'x'添加到正在运行的'y'次。
var total = 0;
for(int i = 0; i < y; i++)
{
total += x;
}
答案 5 :(得分:4)
您可以使用按位运算符进行乘法运算。
x<<1
是x * 2,依此类推。
你仍然需要做一些补充。
result=0;
while(b != 0)
{
if (b&01)
{
result=result+a;
}
a<<=1;
b>>=1;
}
答案 6 :(得分:1)
public uint MultiplyNumbers(uint x, uint y) {
if (x == 0 || y == 0) return 0;
uint answer = x;
for (uint i = 1; i < y; ++i)
answer += x;
return answer;
}