首页 > 解决方案 > 将 double 数组转换为 longss 数组,以保持相对性

问题描述

假设我有一个双精度数组:7.5, 10.0, 30.0 我想转换为长数组:3, 4, 12

这是保留数字之间关系的最小整数表示。

在这种情况下,每个都乘以2,然后除以5。是否有通用算法来完成此操作?

标签: javaalgorithm

解决方案


我猜一些lcmgcd可以解决这个问题。

这个想法是得到所有元素的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;
}

输出:3 4 12


推荐阅读