后来与各同行们探讨,有的建议递归,也有建议用数组,其实给我眼睛一亮的建议就是二进制。比如8=2^3,9=2^3+2^0,其实就是转换二进制的过程,8=1000,9=1001。这令我想到了当时学校的数学知识,这就是求得这个算法的最佳解决方案。
view plaincopy to clipboardprint?
///
/// Convert decimal number to y=2^n1+2^n2+……
///
/// type:long
///
public static string ConvertToBinaryPower(long number)
{
//convert number to binary string
var strBinary = Convert.ToString(number, 2);
//define the result
var strResult = number + "=";
for (int i = strBinary.Length - 1, j = 0; i >= 0; i--, j++)
{
if (strBinary[i] == 49)//49 here is '1'
{
strResult += "2^" + j;
if (i > 0)//if is the last one, need not add '+'
{
strResult += "+";
}
}
}
return strResult;
}
///
/// Convert decimal number to y=2^n1+2^n2+……
///
/// type:long
///
public static string ConvertToBinaryPower(long number)
{
//convert number to binary string
var strBinary = Convert.ToString(number, 2);
//define the result
var strResult = number + "=";
for (int i = strBinary.Length - 1, j = 0; i >= 0; i--, j++)
{
if (strBinary[i] == 49)//49 here is '1'
{
strResult += "2^" + j;
if (i > 0)//if is the last one, need not add '+'
{
strResult += "+";
}
}
}
return strResult;
}
以下是一个同事提供的方案,我做了部分性能上修改:
static string BuildString(long iNumber)
{
StringBuilder strResult =new StringBuilder(iNumber + "=");
for (var i = iNumber.ToString().Length * 4; i >= 0; i--)
{
if ((iNumber - (long)Math.Pow(2, i)) >= 0)
{
iNumber = iNumber - (long)Math.Pow(2, i);
strResult.Append("2^" + i.ToString() + "+");
}
}
strResult.Length--;
return strResult.ToString();
}
另外,十进制转换为二进制的自定义算法:(但是我上面没有用到这个自定义转换,不清楚与Convert.ToString(number, 2)相比哪个效率高)
view plaincopy to clipboardprint?
///
/// Convert decimal number to binary number
///
/// decimal number
///
public static string ConvertDecimalToBinary(long number)
{
long[] temp = new long[100];//as the type is long, the length 100 is enough
//if 0, will not be converted
if (number == 0) return (number.ToString());
var i = 0;
while (number != 0)
{
temp[i++] = number % 2;
number /= 2;
}
var strBinary = "";
for (var j = 0; j <= i - 1; j++)
strBinary += (char)(temp[i - j - 1] + 48);//48 here means the char '0'
return (strBinary);
}
///
/// Convert decimal number to binary number
///
/// decimal number
///
public static string ConvertDecimalToBinary(long number)
{
long[] temp = new long[100];//as the type is long, the length 100 is enough
//if 0, will not be converted
if (number == 0) return (number.ToString());
var i = 0;
while (number != 0)
{
temp[i++] = number % 2;
number /= 2;
}
var strBinary = "";
for (var j = 0; j <= i - 1; j++)
strBinary += (char)(temp[i - j - 1] + 48);//48 here means the char '0'
return (strBinary);
}
另外,心得后的心酸故事:
人常说,喜欢一个人,在一起很开心,爱一个人,不开心也想在一起。原话不知道怎么讲,反正是这个意思。我实现上面的y=2^n1+2^n2+……算法,其实就是想设计出下面这样一个公式来:
L + O + V + E = ABCXYYX + ABC*107 + ((AB) 2 + AC)*106 + XXY + X + Y + BC
我曾经为了追求她,哄她开心,将L, O, V, E用我和她的手机号代入(我们俩每人两个手机,所以有四个号码),A=5,B=2, C=0,X=13,Y=14,分别代入:
134×××××××× + 138×××××××× + 137×××××××× + 189×××××××× = 5201314 + 520*107 + ((52) 2 + 50)*106 + 131314 + 13 + 14 + 20
等式成立,其实想对她表达我的用心和一生一世的爱,520*107足以超过“我爱你一万年”了。我仅用5,2,0,1,3,1,4和幂组成,来等于四个手机号之和(L,O,V,E)。
最后,只可惜,这是一个悲剧,用心良苦,最后还是难免遭受挫折。
转自:http://www.cnblogs.com/architect/archive/2009/03/04/1402823.html
0 评论:
发表评论