Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 31.05.2021
Сообщений: 13

Исправить и дополнить программу. Метод Карацубы. Исправить ошибку и сделать ввод и вывод данных

31.05.2021, 14:09. Показов 963. Ответов 0

Студворк — интернет-сервис помощи студентам
Работаю в Visual studio 2019
Нужно:
1. Добавить к программе ввод и вывод данных, чтобы программа работала успешно.
2. Выскакивает предупреждение, которое не даёт правильно скомпилировать программу. Решить её.

Предупреждение C6386 Переполнение буфера при записи в "s.values": доступный для записи объем равен "s.dlina*4" байт, однако записать можно только "8" байт. 27 строка.

Предупреждение C6385 Чтение недопустимых данных из "znachenie.values": доступный для чтения объем равен "_Old_4`sizeof(civra)*znachenie.dlin a" байт, однако считать можно только "8" байт. 67 строка.

После решения проблемы попрошу в виде ответа выложить полный исправленный код. Ну и если будет не сложно, то и объяснение проблем и их решения. Заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <cstring>
 
#define BASE 10 //система счисления
#define MINIMALNAI_DLINA_KARATSUBA 4 //числа короче умножаются квадратичным алгоритмом
typedef int civra; //взят только для разрядов числа
typedef unsigned long int size_dlina; //тип для длинны числа
 
using namespace std;
 
struct long_value { //тип для длинных чисел
    civra* values; //массив с цифрами числа записанными в обратном порядке
    size_dlina dlina; //длинна числа
};
 
long_value sum(long_value a, long_value b) {
    /* функция для суммирования двух длинных чисел. Если суммируются числа разной длинны
    * то более длинное передется в качестве первого аргумента.
    Возвращает новое
  * ненормализованное число.*/
    long_value s;
    s.dlina = a.dlina + 1;
    s.values = new civra[s.dlina];
 
    s.values[a.dlina - 1] = a.values[a.dlina - 1];
    s.values[a.dlina] = 0;
    for (size_dlina i = 0; i < b.dlina; ++i)
        s.values[i] = a.values[i] + b.values[i];
    return s;
}
 
long_value& sub(long_value& a, long_value b) {
    /*функция для вычитания одного длинного числа из другого. Изменяет содержимое первого
    * числа. Возвращает ссылку на первое число. Результат не нормализован.
    */
    for (size_dlina i = 0; i < b.dlina; ++i)
        a.values[i] -= b.values[i];
    return a;
}
 
void normalize(long_value l) {
    /*Нормализация числа - приведение каждого разряда в соответствие с системой счисления.
    *
    */
    for (size_dlina i = 0; i < l.dlina - 1; ++i) {
        if (l.values[i] >= BASE) { //если число больше максимального, то организовавается перенос
            civra carryover = l.values[i] / BASE;
            l.values[i + 1] += carryover;
            l.values[i] -= carryover * BASE;
        }
        else if (l.values[i] < 0) { //если меньше - заем
            civra carryover = (l.values[i] + 1) / BASE - 1;
            l.values[i + 1] += carryover;
            l.values[i] -= carryover * BASE;
        }
    }
}
 
long_value karatsuba(long_value a, long_value b) {
    long_value znachenie; //результирующее произведение
    znachenie.dlina = a.dlina + b.dlina;
    znachenie.values = new civra[znachenie.dlina];
 
    if (a.dlina < MINIMALNAI_DLINA_KARATSUBA) { //если число короче, то применять наивное умножение
        memset(znachenie.values, 0, sizeof(civra) * znachenie.dlina);
        for (size_dlina i = 0; i < a.dlina; ++i)
            for (size_dlina j = 0; j < b.dlina; ++j) {
                znachenie.values[i + j] += a.values[i] * b.values[j];
            }
    }
    else { //умножение методом Карацубы
        long_value a_part1; //младшая часть числа a
        a_part1.values = a.values;
        a_part1.dlina = (a.dlina + 1) / 2;
 
        long_value a_part2; //старшая часть числа a
        a_part2.values = a.values + a_part1.dlina;
        a_part2.dlina = a.dlina / 2;
 
        long_value b_part1; //младшая часть числа b
        b_part1.values = b.values;
        b_part1.dlina = (b.dlina + 1) / 2;
 
        long_value b_part2; //старшая часть числа b
        b_part2.values = b.values + b_part1.dlina;
        b_part2.dlina = b.dlina / 2;
 
        long_value sum_of_a_parts = sum(a_part1, a_part2); //cумма частей числа a
        normalize(sum_of_a_parts);
        long_value sum_of_b_parts = sum(b_part1, b_part2); //cумма частей числа b
        normalize(sum_of_b_parts);
        long_value rezyltat_summ_chastei = karatsuba(sum_of_a_parts, sum_of_b_parts);
        // произведение сумм частей
 
        long_value rezyltat_pervoi_chasti = karatsuba(a_part1, b_part1); //младший член
        long_value rezyltat_vtoroi_chasti = karatsuba(a_part2, b_part2); //старший член
        long_value summa_srednix_chlenov = sub(sub(rezyltat_summ_chastei, rezyltat_pervoi_chasti), rezyltat_vtoroi_chasti);
        //нахождение суммы средних членов
 
       // Суммирование многочлена
        
        memcpy(znachenie.values, rezyltat_pervoi_chasti.values,
            rezyltat_pervoi_chasti.dlina * sizeof(civra));
        memcpy(znachenie.values + rezyltat_pervoi_chasti.dlina,
            rezyltat_vtoroi_chasti.values, rezyltat_vtoroi_chasti.dlina
            * sizeof(civra));
        for (size_dlina i = 0; i < summa_srednix_chlenov.dlina; ++i)
            znachenie.values[a_part1.dlina + i] += summa_srednix_chlenov.values[i];
    }
 
    normalize(znachenie); //конечная нормализация числа
 
    return znachenie;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2021, 14:09
Ответы с готовыми решениями:

Исправить ошибку, и дополнить программу
Народ помогите исправить ошибки в программе ... 1) при показе Графика ( ось OX и OY почему то убежало в правую сторону . 2) По осях...

Найти и исправить ошибку в выводе строки (шифр Цезаря, файловый ввод/вывод)
ofstream fout(&quot;Результат.txt&quot;); for (int i = 0; i &lt; s.size(); i++){ j = k; k = j % 33; s = al; ...

Исправить ввод данных в программу
Не могу понять, почему при вводе информации пропускается fun_1_1() , помогите разобраться #include &lt;iostream&gt; #include...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.05.2021, 14:09
Помогаю со студенческими работами здесь

Ввод - вывод массивов (Исправить программу, чтобы работала)
Требования к выполнению заданий На оценку 3 балла написать программу в соответствии с заданием, используя статические массивы На...

Шифр Цезаря: исправить ввод-вывод данных в файлы
Помогите, пожалуйста, переписать кусок программы под работу с файлами. static void Main(string args) { ...

Исправить ошибку "can't open input file" (файловый ввод/вывод)
в программе прописан параметр - название текстового файла pushkin.txt Программа выполняется без ошибок, но записи в файл нет, даже если...

Исправить программу, чтобы ввод данных ввести одной строкой, а не столбиком
нужно исправить программу, чтобы ввод данных ввести одной строкой, а не столбиком. unit procedury; interface uses crt,...

Нужно дополнить и исправить программу. Требуется отпечатать список K работников, претендующих на новое жилье
Имеются сведения об обеспеченности жильем N работников предприятия: фамилия работника, количество человек в семье, количество кв. метров...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru