Есть вариант:
class Money
{
private:
unsigned long long rouble;
unsigned char penny;
public:
Money operator *(const Money & m1, double m2)
{
Money m_temp;
double rouble_float = m1.rouble + m1.kopek / 100; //преобразуем имеющиеся рубли с копейками в формат с плавающей точкой
rouble_float *= m2; //умножаем пред. результат со вторым числом
double integer; //создаём доп. переменную для хранения целой части числа с плавающей точкой. Она нужна для функции modf
m_temp.kopek = static_cast<unsigned char>(modf(rouble_float, &integer) * 100); //static_cast'ом говорим, что нам надо преобразовать тип double в тип unsigned char, т.е. отбрасываем точку. Умножаем на 100, т.к. хвост у нас дробный
m_temp.rouble = static_cast<unsigned long long>(integer); //то же самое, но уже для целой части (рубли)
return m_temp;
}
Можно ли умножить без хранения денег в double или float? Если да, то как?
Делайте наоборот - не копейки делить на 100, а рубли умножать, тогда получится целое число.
Money operator *(const Money & m1, double m2)
{
Money m_temp;
long amount= m1.rouble *100 + m1.kopek; // сумма в копейках
amount *= m2;
и дальше разделяйте результат на рубли и копейки как вам нравится.
}
Но вообще более правильный подход изначально хранить денежные суммы в копейках и тогда не возникает проблем с дробными числами.
Я не очень понял Вас, но почему нельзя сделать так:
Money operator *(const Money & m1, double m2)
{
double rubl_part = ((double) m1.rouble) * m2*100;
double kopey_part = ((double) m1.kopek) *m2;
double sum = rubl_part+kopey_part;
//Дальше Ваши преобразования
Money m_temp;
m_temp.rouble = static_cast<unsigned long long>(sum/100);
m_temp.kopek = static_cast<unsigned char>(sum-m_temp.rouble*100);
return m_temp;
}
Пишу с мобилы из метро, поэтому код не проверял, но мне кажется что это проще, чем Ваш исходный вариант.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Теперь, нужно объявить переменную b такого типа, который является специализацией a(В данном случае int, а если бы было A< double > a, то b должна была...
Задача: 1) ввести 10 цифр с клавиатуры, 2) вывести длину самой длинной последовательности повторяющихся чисел в списке