Программа для умножения действительных чисел (дробей) без оператора умножения с использованием циклов - PullRequest
0 голосов
/ 22 ноября 2018

Я думал, что могу создать программу для умножения чисел без использования оператора (*);однако единственная проблема заключается в том, что когда речь идет о числах от нуля до одной или умножении дробных чисел вместе.

Может кто-нибудь дать мне подсказку, пожалуйста, как отредактировать мой код для более эффективного достижения этой цели?как я могу использовать для циклов с дробями, например?

#include <iostream>
#include <string>
using namespace std; 

int main()
{
    double num1, num2, m=0; int count=0; 
    cout<<"enter num1 then num2: "; 
    cin >> num1>> num2; 
    if (num1==0 ||num2==0) {m=0; cout<<m<<endl; return 0;  }

    if (num1>=num2)
    {while(count<num2)
{
    m +=num1; 
    count++; 
}
cout<<m; 
}
else if (num1<num2)
{
 for (double i=0; i<num1; i++)
    {
        m +=num2; 
    }
    cout<<m; 
}

  return 0; 
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы хотите, чтобы два умножили две дроби, вы можете умножить знаменатели, знаменатели, а затем упростить результат, разделив получившиеся элементы на gcd.Gcd может быть рассчитан по алгоритму Евклида.Если вы хотите умножить два числа с плавающей запятой, которые недоступны в виде дробей, вы можете сначала преобразовать каждое из них в близкую дробь.Для заданной точности 1 / N вы можете умножить каждое число с плавающей точкой на N, округлить его и получить числитель, где N - знаменатель.

#include <iostream>
#include <string>
#include <tuple>

//  Euclide algorithm
int gcd (int a, int b) {
    if (a < b) std::swap (a, b);
    while (b > 0) {
        int t = b;
        b = a % b;
        a = t;
    }
    return a;
}
    //  multiplication float * int
double mult_float_int (double a, int b) {
    double res = 0;
    for (int i = 0; i < b; i++)
        res += a;
    return res;
}

//  double -> fraction
std::pair<int,int> float2frac (double x, int N) {
    int a = mult_float_int (x, N);
    int g = gcd (a, N);
    if (g == 0) g = 1;
    return std::make_pair (a/g, N/g);
}

//  multiplication a * b
int mult_int (int a, int b) {
    int res = 0;
    if (a < b) std::swap (a, b);
    for (int i = 0; i < b; i++)
        res += a;
    return res;
}

//  multiplication a0/b0 * a1/b1
std::pair<int,int> mult_frac (int a0, int b0, int a1, int b1) {
    int a2 = mult_int (a0, a1);
    int b2 = mult_int (b0, b1);
    int g = gcd (a2, b2);
    if (g == 0) g = 1;
    return std::make_pair (a2/g, b2/g);
}

int main()
{
    const int N = 100000; 
    int a0, b0, a1, b1, a2, b2; 
    double x, y;
    std::cout << "enter x : "; 
    std::cin >> x; 
    std::cout << "enter y : "; 
    std::cin >> y; 

    std::tie (a0, b0) = float2frac (x, N);
    std::tie (a1, b1) = float2frac (y, N);
    std::tie (a2, b2) = mult_frac (a0, b0, a1, b1);

    std::cout << x << " * " << y << " = " << a2 << "/" << b2 << "\n";
    std::cout << "Error = " << x*y - double(a2)/b2 << "\n";

  return 0; 
}

Демонстрация:

    Process started (PID=7400) >>>
    enter x : 1.25
    enter y : 3.27
    1.25 * 3.27 = 327/80
    Error = 2.21177e-017

Примечание: классический способ приблизить число с плавающей запятой умножением на N сначала было вызвано пользователем463035818.Теоретически лучший способ аппроксимации дробью - использование непрерывных дробей, см., Например, Дроби вместо десятичных дробей .Тем не менее, сделать это без умножения или деления является сложной задачей ...

0 голосов
/ 23 ноября 2018

Полагаю, что это упражнение, и давайте предположим, что у вас уже работает умножение целых чисел *, тогда в двух словах вы можете выполнить следующее:

Допустим, вы хотите N значащих цифр, а затем умножьте каждое числона 10 ^ (N / 2) (вы уже знаете, как умножить на целое число), затем усечь оба числа до целых, умножить целые числа, разделить результат на 10 ^ N.

...