![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Пользователь
Регистрация: 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"); } спасибо за любую помощь! |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Остаток от деления длинного числа на длинное число | 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 |