【大数处理】最小公倍数LCM

虽然简单,但是这道题WA了无数次,以前写JAVA时就WA了,现在写C++,旧题重写又WA了。要注意的东西确实比较多,很值得记录一下。两种解法:

解法一:

#include;
using namespace std;
int main() {
	int a;
	int b;
	int c = 0;
	cin >> a >> b;
	double res = (double)a * b; //右边要进行转换
	while (a%b != 0) {
		c = a % b;
		a = b;
		b = c;
	}
	cout.precision(0);
	cout << fixed << res / b << endl;//去除科学记数法
	cin >> res;//TEST
}
/*
用double的注意事项
1.大数字从右边转换过来的时候第一个要加double
2.要去除科学记数法 fixed
3.要控制小数的位数对不对
*/

这道题在关于格式的方面有三个非常值得注意的地方:
1. 大数字从赋值号的右边的int类型复制到左边的double类型的时候,在右边要强制进行类型转换,因为如果两个int直接相乘有可能就已经在int中直接溢出了,赋值的数据都是错误的。
2.   接下来就是要注意把科学记数法用std::fixed给去掉,double在遇到大数值数据和很多的小数位时会使用科学记数法。
3.   要用cin.precision(0)控制小数的位数,本题目是要求整数输出,但是double是默认精确到小数后面六位数的。


这里要特别注意long long 是存不下 int_MAX * int_MAX的,只能用double来存。

9223372036854775807
4000000000000000000

解法二:

#include;
using namespace std;
int main() {
int a;
int b;
int c = 0;
cin >> a >> b;
long long a1 = a;
long long b1 = b;
while (a%b != 0) {
c = a % b;
a = b;
b = c;
}
cout << a1/b*b1 << endl;
}

用这第二个解法也可以AC,这个的思路就是先用a1/b来减小这个值让他可以保持在int的范围内。但是仔细一想还是有bug的,a1/b*b1是可以超long long的对吧?


import java.math.BigInteger;
import java.util.Scanner;

public class Main{
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args){
        int n = input.nextInt();
        int m = input.nextInt();
        int a = input.nextInt();
        BigInteger x = new BigInteger(Integer.toString(n%a==0?n/a:n/a+1));
        BigInteger y = new BigInteger(Integer.toString(n%a==0?n/a:n/a+1));
        x = x.multiply(y);
        System.out.println(x);
    }
}
最后面再说一下java处理大数的时候,用double超过十位数会使用科学技术法,最简单的方法就是直接用BigInteger或者Bigdecimal就好。

你可能感兴趣的:(【大数处理】最小公倍数LCM)