С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116

Найти сумму цифр произведения трёх чисел

15.03.2015, 21:32. Показов 871. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот код пограммы:

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
#include <fstream>
#include <vector>
 
using std::vector;
 
 
inline void crop(long long& a)
{
    while ((a % 10) == 0)
        a /= 10;
}
 
inline void shove(long long x, vector<int>& vec)
{   
    for (;x != 0; x /= 10)
        vec.push_back(x % 10);
}
 
inline void normal(vector<int>& vec)
{
    for (int i = 0; i < vec.size(); ++i)
    {
        if (vec[i] >= 10){
            if (i == vec.size() - 1){
                vec.push_back(vec[i] / 10);
                vec[i] = vec[i] % 10;
            }
            else{
                vec[i + 1] = vec[i] / 10;
                vec[i] = vec[i] % 10; 
            }
        }
    }
}
 
 
void multi(vector<int>& vec1, vector<int>& vec2)
{
    vector<vector<int> > temp;
 
    for (int i = 0; i < vec2.size(); ++i){
        temp.push_back(vector<int>());
        for (int j = 0; j < vec1.size(); ++i){
            temp[i][j] = vec1[j] * vec2[i];
            normal(temp[i]);
        }
    }
 
    int u = temp.size() - 1;
    for (int i = 0; i < temp.size() - 1; ++i)
        for (int j = 0; j < temp[i].size(); ++j)
            temp[u][j] += temp[i][j];
    normal(temp[u]);
 
    vec1 = temp[u];
}
 
int DO(long long& a, long long& b, long long& c)
{
    if (a == 0 || b == 0 || c == 0)
        return 0;
 
    vector<int> vec_a, vec_b, vec_c;
 
    crop(a);
    crop(b);
    crop(c);
 
    shove(a, vec_a);
    shove(b, vec_b);
    shove(c, vec_c);
 
    multi(vec_a, vec_b);
    multi(vec_a, vec_c);
 
    int out = 0;
 
    for (int i = 0; i < vec_a.size(); ++i)
        out += vec_a[i];
 
    return out;
}
 
 
int main()
{
    std::ofstream fout ("Sum.out");
    std::ifstream fin ("Sum.in");
 
    if(fin)
    {   
        long long a, b, c;
        fin >> a >> b >> c;
 
        fout << DO(a, b, c);
    }
    else
        fout << "Open error";
}
Программа должна считывать из файла три числа, разделенные пробелом, вычислить сумму цифр их произведения , и вывести её в другой файл (например: числа 10 5 2 ; 10*5*2=100; результат 1+0+0=1).Числа могут быть 10 - 20 знаков.
Компилируется нормально, но при выполнении выдает ошибку ( "обнаружена ошибка, приложение будет закрыто . отправить отчет?"). Система win xp.
Я в c++ новичок и не могу понять в чем проблема. Поможете?

Добавлено через 23 минуты
Функция "crop" обрезает нули в конце чисел. (На результат они не влияют)

Добавлено через 44 минуты
Функция "multi" написана неправильно, вот исправленный вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void multi(vector<int>& vec1, vector<int>& vec2)
{
    vector<vector<int> > temp;
 
    for (int i = 0; i < vec2.size(); ++i){
        temp.push_back(vector<int>());
        for (int j = 0; j < vec1.size(); ++i){
            temp[i][j] = vec1[j] * vec2[i];
            normal(temp[i]);
        }
    }
 
    int u = temp.size() - 1;
    for (int i = temp.size() - 1, k = temp.size() - i; i >= 0; --i)
        for (int j = 0, k = temp.size() - i; j < temp[i].size(); ++j)
            temp[u][k] += temp[i][j];
    normal(temp[u]);
 
    vec1 = temp[u];
}
Ошибка чисто логическая, это ничего не иправило.

Добавлено через 2 минуты
Извините, 14 строчка такая:

C++
1
 for (int i = temp.size() - 1; i >= 0; --i)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.03.2015, 21:32
Ответы с готовыми решениями:

Найти произведения цифр чисел. Вычисление произведения цифр числа оформить в виде функции
Даны два натуральных числа a, b. Найти произведения цифр этих чисел. Вычисление произведения цифр числа оформить в виде функции.

Найти сумму произведения четных чисел 1ой строки и произведения положительных чисел 3-го столбца
В матрице А(4;4) найти сумму произведения четных чисел 1ой строки и произведения положительных чисел 3-го столбца не правильно...

Для каждого из трех чисел найти сумму цифр и определить у кого она больше
плиз помогите

6
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
15.03.2015, 22:04
Ставь вначале программы точку останова (breakpoint) кнопкой F9 (если Visual Studio). И пошагово (F10 и/или F11) выполняй до возникновения ошибки. Обнаружишь точное место её появления и наверняка догадаешься что исправить. Может данные не корректны, или происходит выход за пределы диапазона. Да мало ли чего бывает. Как говорил М.С. Горбачев: "главное нАчать, и процесс пойдет".
1
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
15.03.2015, 22:25  [ТС]
Я пишу в "Sublime text 3", это просто редактор без компилятора и отладчика (если я ошибаюсь поправьте).
А качать VS С++ размером >1 гига с моим нетом это не один час. Компилировал с помощью MinGW из ком. строки.
Есть отладчик gdb но без понятия как им пользоваться. Если кто знает док на русском скиньте ссылку пожалуйста.

А vector< vector<int> > temp я правильно объявил и использовал?
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
15.03.2015, 22:49
Можно скачать Visual Studio 6.0, кажется мегабайт 200 по размеру. И Visual Assist к нему, еще мегабайт 20. И будет не хуже новых студий. Хоть какой-нибудь отладчик нужен обязательно. Можно отдельно скачать WinDbg.

Если вектор скомпилировался, значит нормально.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
15.03.2015, 23:16  [ТС]
Прошел программу на gdb, ошибку вызывает строка 44
C++
1
temp[i][j] = vec1[j] * vec2[i];
Ошибка "Program received signal SIGSEGV, Segmentation fault."
В википедии написано "ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом".
Я так понял что это именно выделенное.
Но почему? Как эта строка может обращаться к памяти таким образом? объясните как нубу, если не сложно или киньте ссылку на подобное объяснение.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
16.03.2015, 12:24
Если бы посмотрел отладчиком, что находится в векторе temp, то увидел, что элемента [j] в нем просто не существует (потому что вставлял пустой вектор) :
C
1
temp.push_back(vector<int>());
поэтому, лучше написать так:
C
1
(temp[i]).push_back(vec1[j] * vec2[i]);
и переменную вложенного цикла надо исправить с i на j (в функции multi строка 7)
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
18.03.2015, 18:50  [ТС]
Да я уже и сам додумался, но в силу специфики функции normal лучше заранее резервировать память для вектора.
Да и эта реализация вообще хрень, потом выложу работающую. спасибо за ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2015, 18:50
Помогаю со студенческими работами здесь

Найти произведения положительных элементов матриц, а также сумму этих трех произведений
Если в матрице A(3 на 7) нет элементов , больших 10,для нее и двух других матриц В (5 на 4), С(4 на 4) найти произведение положительных...

Найти наибольшее значение из суммы и произведения трех заданных чисел
Даны три действительных числа. Найдите наибольшее значение из их суммы и произведения. делфи

Напишите программу, которая определяет, сумму цифр трех чисел
Напишите программу, которая определяет, сумму цифр трех чисел (подсчет суммы цифр числа организовать через подпрограмму)

Найти сумму произведения четных чисел 1-ой строки и произведение положительных чисел 3-го столбца матрицы
Здравствуйте, есть задание Создать матрицу А(4;4) целых чисел в пределах -7 до 9. В матрице А(4;4) найти сумму произведения четных чисел...

Найти сумму трех старших цифр числа
Написать функцию и проверяющую ее программу. Функция должна в заданном натуральном числе n находить сумму трех старших цифр заданного числа.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru