这可能是一个非常奇特的问题。
我的问题如下:
TI 83+图形计算器允许您使用汇编和连接电缆或其内置TI-BASIC编程语言对其进行编程。
根据我发现,它只支持16位整数和一些模拟浮点数。
我想使用更大的数字(大约64位),所以我使用一个数字的数组:
{1, 2, 3, 4, 5}
将是Decimal 12345。
二进制,即110000 00111001,或二进制数字数组:
{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}
这将是计算器显示它的方式。
我如何将这个十进制数字数组(对于计算器来说太大而无法将其显示为本机类型)转换为十进制数字数组?
效率不是问题。这不是作业。
这样我就可以自由地为这样的数组实现Addition。
谢谢!
答案 0 :(得分:1)
考虑一下,我想我会用以下'算法'
来做如果是奇数,则存储(从相反的顺序)二进制数组中的1
现在通过以下方法将数字除以2:
再次重复这两个步骤,直到整数减少到0。
二进制数组中的数字是二进制表示
你的例子: 1,2,3,4,5
并重复:
0,6,1,7,2最后一位是偶数所以我们存储0:0,1(注意我们从右到左填充二进制字符串)
等
你最终得到一个二进制文件
编辑: 只是为了澄清以上内容:我所做的只是古老的算法:
int value=12345;
while(value>0)
{
binaryArray.push(value&1);
value>>=1; //divide by 2
}
除了在你的例子中我们没有int但是一个表示(10 base)int的数组; ^)
答案 1 :(得分:0)
这里的主要问题是你在不是彼此的倍数的基数之间进行,因此输入数字和输出数字之间没有直接的孤立映射。您可能必须从最低有效数字开始,在需要查询下一个数字之前输出尽可能多的输出最低有效数字,依此类推。这样,您只需要在任何给定的时间点检查最多2个输入数字。
您可能会发现在处理顺序方面有利于以反向形式存储您的数字(这样最低有效数字在数组中排在第一位)。
答案 2 :(得分:0)
在途中将十进制表示中的每个数字转换为它的二进制表示,然后添加所有数字的二进制表示:
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
编辑:
添加了将数组乘以十进制的方法。在将数字转换为二进制数组之前将数字相乘的Intead必须对数组进行处理。