Конвертировать массив значений типа double в массив значений longss, чтобы сохранить относительность - PullRequest
0 голосов
/ 29 апреля 2020

Скажем, у меня есть массив значений типа double: 7.5, 10.0, 30.0 Я хотел бы преобразовать в массив значений типа long: 3, 4, 12

Это наименьшее представление целых чисел, которое сохраняет соотношение между числами.

В этом случае каждый умножается на 2, а затем делится на 5. Существует ли обобщенный c алгоритм для выполнения sh этого?

1 Ответ

0 голосов
/ 29 апреля 2020

Я думаю, что некоторые lcm s и gcd s могут решить эту проблему.

Идея состоит в том, чтобы получить lcm всех элементов , затем умножьте все элементы на это lcm и возьмите целое число gcd всех этих новых элементов. Затем просто разделите каждый элемент на gcd и напечатайте.

#include <bits/stdc++.h>    
using namespace std;

float mod(float a, float b){
    return a - b * floor(a / b);
}

float gcd(float a, float b){
    if(b == 0) return a;
    return gcd(b, mod(a, b));
}

float lcm(float a, float b){
    return (a * b) / gcd(a, b);
}

int intGcd(int a, int b){
    if(b == 0) return a;
    return gcd(b, a % b);
}


int main(){
    float v[3] = {7.5, 10.0, 30.0};

    float lcmAll = 1;
    for(int i = 0; i < 3; i++){
        lcmAll = lcm(lcmAll, v[i]); 
    }

    int gcdAll = (int) round(lcmAll * v[0]);
    for(int i = 0; i < 3; i++){
        v[i] = round(lcmAll * v[i]);
        gcdAll = intGcd(gcdAll, (int) v[i]); 
    }

    for(int i = 0; i < 3; i++){
        cout<<(int) (v[i] / gcdAll)<<" ";
    }
    cout<<endl;

    return 0;
}

output: 3 4 12

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...