在途中,將十進制表示中的每個數字轉換爲它的二進制表示,然後添加的所有的數字二進制表示:
5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000
101
101000
100101100
11111010000
+ 10011100010000
----------------
11000000111001
在C#概念的證明:
方法轉換爲二進制數字的陣列,加入陣列和乘法陣列由10:
private static byte[] GetBinary(int value) {
int bit = 1, len = 1;
while (bit * 2 < value) {
bit <<= 1;
len++;
}
byte[] result = new byte[len];
for (int i = 0; value > 0;i++) {
if (value >= bit) {
value -= bit;
result[i] = 1;
}
bit >>= 1;
}
return result;
}
private static byte[] Add(byte[] a, byte[] b) {
byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
int carry = 0;
for (int i = 1; i <= result.Length; i++) {
if (i <= a.Length) carry += a[a.Length - i];
if (i <= b.Length) carry += b[b.Length - i];
result[result.Length - i] = (byte)(carry & 1);
carry >>= 1;
}
if (result[0] == 0) {
byte[] shorter = new byte[result.Length - 1];
Array.Copy(result, 1, shorter, 0, shorter.Length);
result = shorter;
}
return result;
}
private static byte[] Mul2(byte[] a, int exp) {
byte[] result = new byte[a.Length + exp];
Array.Copy(a, result, a.Length);
return result;
}
private static byte[] Mul10(byte[] a, int exp) {
for (int i = 0; i < exp; i++) {
a = Add(Mul2(a, 3), Mul2(a, 1));
}
return a;
}
轉換的數組:
byte[] digits = { 1, 2, 3, 4, 5 };
byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
bin[i] = Mul10(GetBinary(digits[i]), exp);
exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
result = result == null ? digit: Add(result, digit);
}
// output array
Console.WriteLine(
result.Aggregate(
new StringBuilder(),
(s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
).ToString()
);
輸出:
1,1,0,0,0,0,0,0,1,1,1,0,0,1
編輯:
用於通過幾十相乘的陣列增加的方法。在將數字轉換爲二進制數組之前將數字相乘,必須對數組進行處理。
優秀,這是有效的。儘管開始時我使用了二分法算法:首先從第一個數字開始(並且在右側工作),並且每次您輸入的數字都是奇數時,您會攜帶一個5來添加除法結果下一個數字。 – wsd 2009-11-09 20:16:59
酷! 5實際上來自數字爲10的基數。基數10除以2爲5.使用二進制除法,您將在進位中添加1(基數2除以2); ^) – Toad 2009-11-10 08:03:47