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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2012, 15:22   #1
MartinSeptim
 
Регистрация: 18.02.2012
Сообщений: 9
Стрелка Разобраться в коде

Здравствуйте! Я нашел код, которой перемножает два числа, размеры которых превышают тип long. Однако, мне непонятны некоторые участки кода. Если можете объясните для чего используются vec.push_back , rez.back() , rez.pop_back() , и как работает
Код:
void readlong (type &vec)
{
    std::string str;
    std::cin >> str;
 
    for (int i = str.size (); i > 0; i--)
        vec.push_back (atoi (str.substr (i - LEN, LEN).c_str()));
}
Сам код:
Код:
#include "StdAfx.h"
#include "conio.h"
#include <iostream>
#include <vector>
#include <iomanip>
#include <string>
#include <cstdlib>
#define BASE 10
#define LEN 1
 
typedef std::vector <int> type;
 
void readlong (type &);
void mult (type &, type &, type &);
 
int main()
{
    type a, b, rez;
 
    std::cout << "First long number: ";
    readlong (a);
    std::cout << "Second long number: ";
    readlong (b);
 
    mult (a, b, rez); //использование умножения
 
    std::cout << rez.back ();
    for (int i = rez.size () - 2; i >= 0; i--)
        std::cout << rez[i];
 getch();
    return 0;
}
 
void readlong (type &vec)
{
    std::string str;
    std::cin >> str;
 
    for (int i = str.size (); i > 0; i--)
        vec.push_back (atoi (str.substr (i - LEN, LEN).c_str()));
}
 
void mult (type &a, type &b, type &rez)
{
    rez.resize (a.size() + b.size());
    for (int i = 0; i < a.size(); ++i)
        for (int j = 0, carry = 0; j < b.size() || carry; ++j) //сarry вес разряда
        {
            long long cur = rez[i+j] + a[i] * (j < b.size() ? b[j] : 0) + carry;
            rez[i+j] = cur % BASE;
            carry = cur / BASE;
        }
 
    while (rez.size() > 1 && rez.back() == 0)
        rez.pop_back();
}
MartinSeptim вне форума Ответить с цитированием
Старый 18.02.2012, 16:11   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

MartinSeptim

чего используются vec.push_back , rez.back() , rez.pop_back()

гоогле c++ класс vector
Rififi вне форума Ответить с цитированием
Старый 20.02.2012, 21:34   #3
MartinSeptim
 
Регистрация: 18.02.2012
Сообщений: 9
По умолчанию

Ок, я нагуглил и нашел всё что нужно по вектору, но мне все ещё не понятны следующие строки:
Код:
(str.substr (i - LEN, LEN).c_str()));
и механизм действия

Код:
{
            long long cur = rez[i+j] + a[i] * (j < b.size() ? b[j] : 0) + carry;
            rez[i+j] = cur % BASE;
            carry = cur / BASE;
        }
MartinSeptim вне форума Ответить с цитированием
Старый 20.02.2012, 21:49   #4
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Код:
(str.substr (i - LEN, LEN).c_str()));
substr - субстрока (начиная с символа i - LEN заканчивая LEN) из строки str
c_str() - СИшная строка - char*

Код:
(j < b.size() ? b[j] : 0)
тоже-самое что и:

Код:
if (j < b.size())
  var = b[j];
else
  var = 0;
Код:
cur % BASE;
Деление по модулю.
crymchanin вне форума Ответить с цитированием
Старый 21.02.2012, 18:13   #5
MartinSeptim
 
Регистрация: 18.02.2012
Сообщений: 9
По умолчанию

Итак, последнее по этому коду. Помогите пожалуйста сделать использование нового readlong после вбивания точки. То есть идут 123456712345678123.123456781234567 и всё что после точки обрабатывается новым readlong-ом. Это нужно для перемножения двух чисел с фиксированной запятой - числа до точек перемножаются друг с другом отдельно, после точек тоже отдельно.
MartinSeptim вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается разобраться в коде stck Общие вопросы C/C++ 5 22.12.2011 17:24
не могу разобраться в коде zif0rka PHP 6 05.12.2011 01:22