Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2012, 22:44   #1
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
Вопрос Умножение длинного числа на короткое.

Здраствуйте!
не полчается ревлизовать умножение динного числа на короткое!
Для хранения числа использую двусвязный список!

Вот код всей программы!


#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <iostream>

/* Структура, описывающая элемент двунаправленного списка */
typedef struct item
{
int digit;
struct item *next;
struct item *prev;
} Item;

/* Структура, описывающая многоразрядное число */
typedef struct mnumber
{
Item *head;
Item *tail;
int n;
} MNumber;

MNumber CreateMNumber(char *initStr);
void AddDigit(MNumber *number, int digit);
void PrintMNumberHead(MNumber number);
void PrintMNumberTeil(MNumber number);
MNumber SumMNumber(MNumber n1, MNumber n2);
MNumber LongDiv_ModShort(MNumber n1, int del);
int Equal(MNumber p1, MNumber p2);
MNumber LongMulShort(MNumber n1, int x);//УМНОЖЕНИЕ ДЛИННОГО ЧИСЛА НА КОРОТКОЕ


void main(void)
{
setlocale(LC_ALL, "Russian");
char n1[1000];
char n2[1000];
int n3;
printf("Введите первое многорозрядное число!(Long(1))\n");
gets(n1);
MNumber a = CreateMNumber(n1);
printf("Введите второе многорозрядное число!(Long(2))\n");
gets(n2);
MNumber b = CreateMNumber(n2);
printf("Введите число типа int!(short)\n");
scanf("%d", &n3);
printf("Результат сравнения = %d.\n", Equal(a, b));
MNumber c = LongDiv_ModShort(a, n3);
printf("LongDivShort = ");
PrintMNumberHead(c);
printf("Long(1)MulShort = ");
MNumber d1 = LongMulShort(a, n3);
PrintMNumberHead(d1);
/*printf("Long(2)MulShort = ");
MNumber d2 = LongMulShort(b, n3);
PrintMNumberHead(d2);*/

getch();
}


/* Создает многоразрядное число из цифр строки */
MNumber CreateMNumber(char initStr[])
{
MNumber number = {NULL, NULL, 0};
int n;
for (n = strlen(initStr)-1; n >= 0; n--)
AddDigit(&number, initStr[n]-'0');
return number;
}


/* Добавляет цифру в многоразрядное число */
void AddDigit(MNumber *number, int digit)
{
Item *p = (Item *)malloc(sizeof(Item));
p->digit = digit;
p->next = p->prev = NULL;
if (number->head == NULL)
number->head = number->tail = p;
else
{
number->tail->next = p;
p->prev = number->tail;
number->tail = p;
}
number->n++;
}


/*сравнивает два многоразрядных числа*/
int Equal(MNumber p1, MNumber p2)
{
int x1 = 0, x2 = 0;
Item *P1 = p1.head;
Item *P2 = p2.head;
while (P1)
{
x1++;
P1 = P1->next;
}
while(P2)
{
x2++;
P2 = P2->next;
}
if (x1 > x2) return 1;
if (x1 < x2) return -1;
if (x1 = x2)
{
P1 = p1.head;
P2 = p2.head;
while (P1 && P2)
{
x1 = P1->digit;
x2 = P2->digit;
if (x1 > x2) return 1;
if (x1 < x2) return -1;
P1 = P1->next;
P2 = P2->next;
}
return 0;
}

}


/* Возвращает целую часть от деления многоразрядного чилсла на короткое типа int а так же остаток от деления длинного на короткое*/
MNumber LongDiv_ModShort(MNumber n1, int del)
{
MNumber div = CreateMNumber("");
MNumber mod = CreateMNumber("");
Item *p1 = n1.tail;
int digit, s1 = 0;
while (p1)
{
if (p1) { s1 += p1->digit; p1 = p1->prev; }
digit = s1 / del;
AddDigit(&div, digit);
s1 = (s1 % del) * 10;
}
AddDigit(&mod, s1 / 10);
printf("LongModShort = ");
PrintMNumberHead(mod);
return div;
}

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
/*Возвращает результат умножения длинного числа на короткое типа int*/
MNumber LongMulShort(MNumber n1, int x)
{
MNumber mul = CreateMNumber("");
Item *p1 = n1.head;
int s1, digit = 0, pos = 0;
int mod = 0;
mod = x % 10;
if (mod != 0)
{
while(p1)
{
if(p1) { s1 = p1->digit; p1 = p1->next; }
digit = (s1 * mod + pos) % 10;
pos = (s1 * mod + pos) / 10;
AddDigit(&mul, digit);
}
if (pos) AddDigit(&mul, pos);
LongMulShort(mul, mod);
}
return mul;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//

/* Выводит многоразрядное число на экран начиная с конца */
void PrintMNumberTeil(MNumber number)
{
Item *p = number.tail;
while (p)
{
printf("%d", p->digit);
p = p->prev;
}
printf("\n");
}

/* Выводит многоразрядное число на экран начиная с начала */
void PrintMNumberHead(MNumber number)
{
Item *p = number.head;
while (p)
{
printf("%d", p->digit);
p = p->next;
}
printf("\n");
}

спасибо за любую помощь!
7rubin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Остаток от деления длинного числа на длинное число SlashMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 12 17.04.2012 11:03
МТ. Умножение числа на 2. [Delphi] JorJe Помощь студентам 0 16.10.2011 20:42
Умножение длинного числа на короткое (Турбо Паскаль) IvaIlga Помощь студентам 6 05.05.2011 17:15
Перенос длинного текста в ячейке таблицы den_1973 HTML и CSS 4 12.10.2010 15:29
Переопределение оператора умножения для класса. Умножение числа на класс. capta1n Общие вопросы C/C++ 2 06.03.2010 16:50