让我们直言不讳。我做了下面的代码来乘以两个数字,它正在“吃掉”我的零!对于不涉及产品(p)等于零的情况,似乎工作正常。在样本情况下,它只是打印“5”而不是所需的“500”。如果有人愿意解释发生了什么,我真的很感激。 :)
using System;
class Program
{
static void Main()
{
Console.WriteLine(smallNumBigNumProduct("5", "100"));
}
static string smallNumBigNumProduct(string s, string b)
{
int l = s.Length;
int f = int.Parse(s); // factor
int c = 0; // carry
string r = ""; // result
int p; // product
while(l-- > 0)
{
p = (Convert.ToInt32(b[l]) - 48) * f;
p += c;
if (p > 9)
{
r = Convert.ToString(p % 10) + r;
c = p / 10;
}
else
r = Convert.ToString(p) + r;
}
if (c > 0)
{
r = Convert.ToString(c) + r;
}
return r;
}
}
答案 0 :(得分:5)
这是你的问题:
int l = s.Length;
...
while(l-- > 0)
您要将l
变量设置为 short 字符串的长度,然后在while
循环中预先递减它。
简而言之,您的循环不会执行您认为的次数。 l
变量不应设置为b
字符串的长度吗?
无论如何,这看起来像是一个很长且容易出错的方法。为什么不简单地将输入字符串转换为整数并直接返回产品?
答案 1 :(得分:4)
怎么样:
public static string smallNumBigNumProduct(string a, string b)
{
// NOTE no error checking for bad input or possible overflow...
int num1 = Convert.ToInt32(a);
int num2 = Convert.ToInt32(b);
return ((num1*num2).ToString());
}
如果你使用的是.NET 4.0,那就更好了(由于Gabe的提示而更新):
public static string smallNumBigNumProduct(string a, string b)
{
// NOTE no error checking for bad input or possible overflow...
BigInteger num1 = BigInteger.Zero;
BigInteger num2 = BigInteger.Zero;
bool convert1 = BigInteger.TryParse(a, out num1);
bool convert2 = BigInteger.TryParse(b, out num2);
return (convert1 && convert2) ? (num1*num2).ToString() : "Unable to convert";
}