C/C++

Как перемножить два числа в 16-битной системе, чтобы на выходе получилось большое 32-битное или 64-битное число?

Короче, мой знакомый недавно нет смог пройти тест в одну крутую IT-компанию.
Там было две трудных задачки.
Одна задача была такая:
перемножьте два числа в 16-битной системе, чтобы получилось 32-битное или 64-битное число.

Как можно было решить такую задачу, если времени на решение одной задачи давалось минут 30-40?
Ugur Kaçmaz
Ugur Kaçmaz
7 402
Надо было тупо столбиком умножить два числа, предварительно запихав их поразрядно в массив.
А на выход можно вывести в любом формате, хоть в целом(поразрядно), хоть строчкой текста.
Ещё не забыть учесть знак результата.


#include<stdio.h>
#include<stdlib.h>//для паузы Windows
#define limit 8

short int mult[limit+2][limit*2]={0};
char flagf=0, flags=0;

//сбросить флаги:
void EraseFlags()
{
flagf=0;
flags=0;
}

//перенести значение
//поразрядно в массив:
int toArray(short int *arr, short int d)
{
short int num=d, ind=limit-1;
for(int i = 0; i < limit; i++)
arr[i] = 0;
while(num!=0)
{
arr[ind--] = num%10;
num/=10;
}
if(num==0 && ind>=-1) return 0;
return 1;
}

//вывести результат умножения:
void Result()
{
short int pos=0;
while(mult[limit+1][pos]==0)
pos++;
printf("\nResult of multiplication: ");
if((flagf&&!flags)||(!flagf&&flags))
printf("-");
for(int j = pos; j < limit*2; j++)
printf("%d",mult[limit+1][j]);
}

//очистить таблицу расчётов:
void EraseMatrix()
{
for(int i = 0; i < limit+2; i++)
for(int j = 0; j < limit*2; j++)
mult[i][j] = 0;
}

//очистить массив значения:
void EraseArray(short *arr, short lim)
{
for(int i = 0; i < lim; i++)
arr[i] = 0;
}

//взять правый разряд числа:
int rdig(short int d)
{
if(d<10 && d>=0) return d;
if(d>-10 && d<0) return d;
return d%10;
}

//взять левый разряд числа:
int ldig(short int d)
{
if(d<10 && d>=0) return 0;
if(d>-10 && d<0) return 0;
return (d/=10)%10;
}


int main()
{
short int
first[limit]={0},
fmind[limit]={0},
second[limit]={0},
ind2=0, f=0, s=0;

printf("Enter first number: ");
scanf("%hd", &f);
if(f<0) {f*=(-1); flagf=1;};
toArray(&first,f);

printf("\nEnter second number: ");
scanf("%hd", &s);
if(s<0) {s*=(-1);flags=1;};
toArray(&second,s);

//умножение столбиком f*s:
for(int i = limit-1; i >=0; i--)
{
int ind=(limit*2-1)-ind2++;
for(int j = limit-1; j >=0; j--)
{
short int
m = first[j]*second[i]+fmind[j];
mult[limit-i][ind--] = rdig(m);
mult[0][ind]=ldig(m);
fmind[j-1] = ldig(m);
}
}

//сложение результатов построчно:
for(int i = 1; i < limit+1; i++)
for(int j = 0; j < limit*2; j++)
mult[limit+1][j]=
mult[limit+1][j]+mult[i][j];

//сложение итоговой строки:
for(int j = limit*2-1; j>0; j--)
{
short int left=ldig(mult[limit+1][j]),
right=rdig(mult[limit+1][j]);
mult[limit+1][j]=right;
mult[limit+1][j-1]+=left;
}

Result();
EraseMatrix();
EraseArray(&first, limit);
EraseArray(&second, limit);
EraseArray(&fmind, limit);
EraseFlags();
system("pause"); //пауза для Windows
return 0;
}
Сергей Сединкин
Сергей Сединкин
37 945
Лучший ответ
Ugur Ka&#231;maz это какая-то готовая типовая задача?
Эта крутая IP компания не иначе как занимается производством калькуляторов на импортозамещении.
Ugur Ka&#231;maz это конторка мастрячит микроконтроллеры для роботов
Сергей Светлицкий "Игорька" микроконтроллер не спасет...
может на ассемблере просили?
Роман Замараев
Роман Замараев
21 700

Похожие вопросы