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

  • Автор темы MartinSeptim
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

MartinSeptim

#1
Здравствуйте! Помогите пожалуйста реализовать следующее: задается две строки, часть из первой до запятой отправляется в 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() удаляет последний элемент списка. */
}
 
Статус
Закрыто для дальнейших ответов.