Соединить два числа в одно на C
У меня есть два массива:
long long ** a = (long long**)malloc(size * size * sizeof(long long));
long long ** b = (long long**)malloc(size * size * sizeof(long long));
Мне необходимо, чтобы каждые четыре элемента из массива a сливались в один элемент массива b не преобразовывая чисел в строки:
a[0] = 10;
a[1] = 12;
a[2] = 3;
a[3] = 8944;
b[0] = 101238944;
Нагуглить не смог (или не понял, как это сделать)
Ответы (2 шт):
Автор решения: Никита Самоуков
→ Ссылка
Надо просто измерить длину чисел и домножить на 10^X.
auto l1 = quick_pow10(numDigits(a[1]));
auto l2 = quick_pow10(numDigits(a[2]));
auto l3 = quick_pow10(numDigits(a[3]));
b[0] = ((a[0] * l1 + a[1]) * l2 + a[2]) * l3 + a[3];
Автор решения: avp
→ Ссылка
Ловите образец, под свои массивы сами доделайте.
#include <stdio.h>
unsigned long long
cdigs (unsigned long long r, unsigned long long v, int level)
{
if (v == 0)
return level ? r : r * 10;
char d = v % 10;
return cdigs(r, v / 10, ++level) * 10 + d;
}
int
main (int ac, char *av[])
{
unsigned long long a[8] = {10, 201, 3001, 4001, 1, 0, 2, 30}, t, b[2];
for (int i = 0, j = 0; j < 2; j++, i += 4) {
t = cdigs(0, a[i], 0);
t = cdigs(t, a[i + 1], 0);
t = cdigs(t, a[i + 2], 0);
b[j] = cdigs(t, a[i + 3], 0);
}
/* или можно даже так ...
b[0] = cdigs(cdigs(cdigs(cdigs(0, a[0], 0), a[1], 0), a[2], 0), a[3], 0);
*/
printf("%llu %llu\n", b[0], b[1]);
}
Т.е. мы в рекурсии разбиваем число на десятичные цифры, а возвращаясь из нее добавляем их к результату.
(практически так же вы поступаете, когда
- разбираете число на цифры для печати;
- читая цифры, получаете из них число
только в этом случае начальное значение числа не 0, а уже накопленная ранее комбинация цифр)