Если вы встраиваете это в язык (я полагаю, что для изучения), я думаю, что, возможно, я бы написал небольшую библиотеку BCD. Просто сохраните ваши номера BCD внутри байтовых массивов.
Фактически, с сегодняшними гигантскими возможностями хранения, вы можете просто использовать байтовый массив, где каждый байт содержит только цифру (0-9). Затем вы пишете собственную подпрограмму для сложения, вычитания и умножения и деления ваших байтовых массивов.
(Делить сложно, но держу пари, что где-нибудь можно найти код).
Я могу дать вам некоторый Java-подобный psuedocode, но на данный момент не могу сделать C ++ с нуля:
class BigAssNumber {
private byte[] value;
// This constructor can handle numbers where overflows have occurred.
public BigAssNumber(byte[] value) {
this.value=normalize(value);
}
// Adds two numbers and returns the sum. Originals not changed.
public BigAssNumber add(BigAssNumber other) {
// This needs to be a byte by byte copy in newly allocated space, not pointer copy!
byte[] dest = value.length > other.length ? value : other.value;
// Just add each pair of numbers, like in a pencil and paper addition problem.
for(int i=0; i<min(value.length, other.value.length); i++)
dest[i]=value[i]+other.value[i];
// constructor will fix overflows.
return new BigAssNumber(dest);
}
// Fix things that might have overflowed 0,17,22 will turn into 1,9,2
private byte[] normalize(byte [] value) {
if (most significant digit of value is not zero)
extend the byte array by a few zero bytes in the front (MSB) position.
// Simple cheap adjust. Could lose inner loop easily if It mattered.
for(int i=0;i<value.length;i++)
while(value[i] > 9) {
value[i] -=10;
value[i+1] +=1;
}
}
}
}
Я использую тот факт, что у нас много дополнительного пространства в байте, чтобы помочь справиться с дополнительными переполнениями в общем виде. Может также работать на вычитание и может помочь в умножении.