Короче, мой знакомый недавно нет смог пройти тест в одну крутую IT-компанию.
Там было две трудных задачки.
Одна задача была такая:
перемножьте два числа в 16-битной системе, чтобы получилось 32-битное или 64-битное число.
Как можно было решить такую задачу, если времени на решение одной задачи давалось минут 30-40?
C/C++
Как перемножить два числа в 16-битной системе, чтобы на выходе получилось большое 32-битное или 64-битное число?
Надо было тупо столбиком умножить два числа, предварительно запихав их поразрядно в массив.
А на выход можно вывести в любом формате, хоть в целом(поразрядно), хоть строчкой текста.
Ещё не забыть учесть знак результата.
#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;
}
А на выход можно вывести в любом формате, хоть в целом(поразрядно), хоть строчкой текста.
Ещё не забыть учесть знак результата.
#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;
}

Ugur Kaçmaz
это какая-то готовая типовая задача?
Эта крутая IP компания не иначе как занимается производством калькуляторов на импортозамещении.
Ugur Kaçmaz
это конторка мастрячит микроконтроллеры для роботов
Сергей Светлицкий
"Игорька" микроконтроллер не спасет...
может на ассемблере просили?
Похожие вопросы
- Для знающих: как рассчитали максимум видимости оперативной памяти для 32- и 64-разрядных систем? На примере Windows.
- С++ Максимум трёх чисел Даны три целых числа. Найдите наибольшее из них (программа должна вывести ровно одно целое число
- 8-битные таймеры-счётчики : Составить схему в Proteus и Написать код для работы микроконтроллера
- Помогите пожалуйста с Массивами .В языке С .Заполнил 2-мерный массив N и M случайными числами дальше не понимаю.
- Сколько раз нужно взять остаток от деления числа на кол-во единиц в его двоичном представлении, чтобы получить 0
- С++ сириус Номер числа Фибоначчи
- На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
- Программирование на С++.Комплексное число представляют парой действительных чисел (a,b).
- Как проверить одинаковые числа в массиве без повторений на С++
- Число Хэмминга C++