Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Deymos
Сообщений: n/a
#1

Умножения целых переменных произвольной длины - C++

02.06.2009, 15:22. Просмотров 865. Ответов 1
Метки нет (Все метки)

Стоит такая задача: необходимо написать пограмму на СИ++ умножения целых переменных произвольной длины с использованием операций сложения и сдвига.
Порывшись в источниках на эту тему получил вот что:

#include <stdio.h>
#include <conio.h>

void add(unsigned char out[], unsigned char in1[],
unsigned char in2[], int n)
{int i;
int carry; // Бит переноса
unsigned w; // Рабочая переменная для сложения двух байтов
for (i=0, carry=0; i<n; i++)
{
out [i] = w = in1[i]+in2[i]+carry;
carry = (w & 0x0100) >>8;
}}

void lshift(unsigned char in[], int n)
{ int carry; // Бит переноса
int i,z;
for (carry=0, i=0; i<n; i++)
{
z=(in[i] & 0x80)>>7; // Выделить старший бит (перенос)
in[i] <<= 1; // Сдвинуть влево и установить
in[i] |=carry; // старый перенос в младший бит
carry = z; // Запомнить новый перенос
}}
void rshift(unsigned char in[], int n)
{
int carry; // Бит переноса
int i,z;
for (carry=0, i=n-1; i>=0; i--)
{
z = in[i] & 1; // Выделить младший бит (перенос)
in[i] >>= 1; // Сдвинуть вправо и установить
in[i] |= carry <<7; // старый перенос в старший бит
carry = z; // Запомнить новый перенос
}}

void mul(unsigned char out[], unsigned char aa[], unsigned char bb[], int n)
{
int i;
for (i=0; i<n; i++) out[i]=0;
for (i=0; i< n* 8; i++)
{ // Цикл по количеству битов
if (bb[0] & 1 ) // Разряд множителя равен 1
add(out,out,aa,n); // Добавить множимое к произведению
lshift(aa,n); // Множимое - влево
rshift(bb,n); // Множитель - вправо
}}


void main()
{

unsigned int a1, b1, out1;
unsigned char *out, *a, *b;

clrscr();

printf('‚ўҐ¤ЁвҐ ¤ў 楫ле зЁб« :
');
scanf('%d',&a1);
scanf('%d',&b1);

a = new char[sizeof(int)];
b = new char[sizeof(int)];
out = new char[sizeof(long int)];

a = (unsigned char*) a1;
b = (unsigned char*) b1;


mul(out,a,b,sizeof(long));

for(int i=0; i<8; i++)
printf('%d ', out[i]);

out1 = (int) out;

printf('
%d
',out1);

getch();
}

но проблема заключается в том, что в out записывается 0, помогите найти ошибку пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 15:22     Умножения целых переменных произвольной длины
Посмотрите здесь:

Строка произвольной длины... - C++
Доброго дня, товарищи! Что-то я подзабыл как сделать на С++ так, чтобы можно было самому вводить строку произвольной длины в ходе...

Обработка массивов произвольной длины - C++
Дан массив С= и матрица А. Изменить матрицу А, увеличив каждый элемент, который меньше элемента главной диагонали, находящегося с ним в...

Обработка массивов произвольной длины - C++
помогите, пожалуйста, с программой на С++) Дан массив С=1, с2, &quot;..,&quot; сn] и матрица А. Изменить матрицу А, увеличив каждый элемент,...

Разряженный вектор произвольной длины - C++
Помогите пожалуйста ответить на вопрос:&quot;Определить набор операций и структуру данных для абстрактного типа данных «Разряженный вектор...

Функции и массивы произвольной длины - C++
Привет! Помогите, пожалуйста, найти ошибку и разобраться с таким типом заданий, где неизвестен размер массива. В задачнике было...

Ввод строки с пробелами произвольной длины - C++
Помогите, пожалуйста. Нужно ввести строку произвольной длины с пробелами и различными символами. Мой код: char *s; s=new...

Разобрать число произвольной длины на цифры - C++
Нужно разобрать число произвольной длины на цифры и вывести их по одному. Всё это в циклах for, while, do while. Пользоваться массивом...

Слово произвольной длины напечатать в виде треугольника - C++
ввести слово произвольной длины и напечатать его в виде треугольника с++

Ввести строку произвольной длины. Распечатать середину 15 раз. - C++
Доброго времени суток! Пожалуйста, подскажите решение: Ввести строку произвольной длины. Распечатать середину 15 раз. Заранее...

Посчитать, сколько слов содержит текст произвольной длины. - C++
Посчитать сколько слов, содержит текст поисзвольной длины. Разделителем между словами является символ пробела. Вывести на экран список всех...

3. Ввести строку произвольной длины. Сосчитать количество слов в ней. - C++
3. Ввести строку произвольной длины. Сосчитать количество слов в ней.

Фото для газеты. Количество комбинаций произвольной длины от 1 до N элементов - C++
Помогите, пожалуйста, решить задачу. Я так понял, что ответом на задачу будет число n^k (для примера 2^3), где k - это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
2563 / 1785 / 252
Регистрация: 08.06.2007
Сообщений: 6,913
Записей в блоге: 4
03.06.2009, 18:36     Умножения целых переменных произвольной длины #2
В программе предполагается, что sizeof(long int) в два раза больше чем sizeof(int). Это верно для старых 16-разрядных компиляторов. Если вы пользуетесь новым, 32-разрядным, то для того чтобы произведение поместилось в предназначенное ему место, память можно выделить так:
Код
a = new char[sizeof(int)]; 
b = new char[sizeof(int)]; 
out = new char[2*sizeof(int)];
А может, еще где закралась ошибка...
Yandex
Объявления
03.06.2009, 18:36     Умножения целых переменных произвольной длины
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru