Умножение Длинных Чисел С Фиксированной Запятой

Тема в разделе "C/C++/C#", создана пользователем MartinSeptim, 2 мар 2012.

Статус темы:
Закрыта.
  1. MartinSeptim

    MartinSeptim Гость

    Репутация:
    0
    Здравствуйте! Помогите пожалуйста реализовать следующее: задается две строки, часть из первой до запятой отправляется в readlong( a ) заместо cin>>str , часть после в readlong( b ). Аналогично для второй строки. Сами readlong и всё умножение у меня прекрасно работает, нужен только метод "забивания" кусочка строки.

    Сама задача: перемножьте два длинных числа с фиксированными запятыми.

    Моя реализация:

    Код (C++):
    #include "StdAfx.h"
    #include "conio.h"
    #include <iostream>
    #include <vector>
    #include <iomanip>
    #include <string>
    #include <cstdlib>
    #define BASE 10 /*система счисления*/
    #define LEN 1 /*Команда #define используется для организации замены строки по всему файлу, где она указана.*/

    typedef std::vector <int> type;
    using namespace std;
    void readlong (type &);
    void mult (type &, type &, type &);


    int main()
    { string str1;
    type a, b, c, d, rez;



    cout << "First part of 1-st long number: ";
    readlong (a);
    cout << "First part of 2-nd long number: ";
    readlong (b);
    cout << "Second part of 1-st long number: ";
    readlong (c);
    cout << "Second part of 2-nd long number: ";
    readlong (d);


    mult (a, b, rez); /*использование умножения для первой части*/

    cout << rez.back ();
    for (int i = rez.size () - 2; i >= 0; i--)
    {cout << rez[i]; rez[i]=0;}
    printf(",");
    mult (c, d, rez); /*для второй*/
    cout << rez.back ();
    for (int i = rez.size () - 2; i >= 0; i--)
    {cout << rez[i]; rez[i]=0;}
    getch();
    return 0;
    }


    void readlong (type &vec)
    {
    string str;
    cin >>str;
    int len=str.length(); /*len длина строки*/
    if (len>50) cout << "Wrong number "; else {{
    for (int i = str.size (); i > 0; i--)
    vec.push_back (atoi (str.substr (i - LEN, LEN).c_str())); }
    /*substr - субстрока (начиная с символа i - LEN заканчивая LEN) из строки str
    c_str() - СИшная строка - char*
    atoi конвертация строки в числовой вид                                                      
    */
                                               
    }}

    void mult (type &a, type &b, type &rez)
    {
    rez.resize (a.size() + b.size()); /*size возвращает количество элементов*/
    for (int i = 0; i < a.size(); ++i)
    for (int j = 0, carry = 0; j < b.size() || carry; ++j) //сarry вес разряда
    /*
    (j < b.size() ? b[j] : 0)
    тоже-самое что и:  if (j < b.size())
    var = b[j];
    else
    var = 0;*/

    {
    long long cur = rez[i+j] + a[i] * 1ll * (j < b.size() ? b[j] : 0) + carry;
    rez[i+j] = cur % BASE;/*деление по модулю*/
    carry = cur / BASE;
    }

    while (rez.size() > 1 && rez.back() == 0) /*Функция back() возвращает ссылку на последний элемент вектора.*/
    rez.pop_back(); /*Функция pop_back() удаляет последний элемент списка. */
    }
     
Загрузка...
Похожие Темы - Умножение Длинных Чисел
  1. student22rus
    Ответов:
    1
    Просмотров:
    3.120
  2. alexas
    Ответов:
    8
    Просмотров:
    3.912
Статус темы:
Закрыта.

Поделиться этой страницей