java - 将 double 数组转换为 longss 数组,以保持相对性
问题描述
假设我有一个双精度数组:7.5, 10.0, 30.0
我想转换为长数组:3, 4, 12
这是保留数字之间关系的最小整数表示。
在这种情况下,每个都乘以2
,然后除以5
。是否有通用算法来完成此操作?
解决方案
我猜一些lcm和gcd可以解决这个问题。
这个想法是得到所有元素的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
推荐阅读
- vim - 如何删除vim中的最后一个空行?
- react-native - 视频预览(来自 react-native-video)未显示
- java - Android Studio:API 调用 - 如何从 JSON 对象中读取对象
- node.js - 将 discord.js bot 转换为 exe
- php - 多个文件附件并通过表单发送
- ffmpeg - 使用 NVENC 的 ffmpeg 强调级别图
- react-native - GetStream Chat React 本机:[错误:不支持 crypto.getRandomValues()。见 https://github.com/uuidjs/uuid#getrandomvalues-not-supported]
- javascript - 按给定顺序对数据表的列进行排序
- ruby-on-rails - Docker-compose Rails 后端 + postgresql 无法将主机名“db”转换为地址:名称或服务未知
- python - python函数输入参数中的空格,因为它是一个cython函数?