算法训练 最大最小公倍数(此题是坑)

来源:互联网 发布:mac app store更改用户 编辑:程序博客网 时间:2024/04/30 23:02

如文章题目所说,这题就是个坑,至本文发布的时候还没填上!它的测试数据是错误的!

题目:

问题描述

已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式

输入一个正整数N。

输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定

1 <= N <= 106

我的代码如下:

#include <iostream>#include <queue>using namespace std;int c_div(int m, int n){if (m < n){int t = m;m = n;n = t;}int i;for (i=n; i>0; --i){if (n%i==0 && m%i==0){return i;}}return 0;}long long c_mul(int n1, int n2, int n3){int d12 = c_div(n1, n2);n2 /= d12;int d13 = c_div(n1, n3);n3 /= d13;int d23 = c_div(n2, n3);n3 /= d13;return (long long)n1*n2*n3;}int main(){long long n;cin>>n;if (n%2 == 0){if(n == 2){cout << 2 << endl;}else{long long a1, a2, a3, a4;a1 = c_mul(n-2, n-1, n);a2 = c_mul(n-3, n-1, n);a3 = c_mul(n-3, n-2, n);a4 = c_mul(n-3, n-2, n-1);priority_queue<long long> q;q.push(a1);q.push(a2);q.push(a3);q.push(a4);cout << q.top() << endl;}}else{if (n == 1){cout << 1 << endl;}else{cout << n*(n-1)*(n-2) << endl;}}return 0;}

就是很普通的做法。先将N分为奇数以及偶数,如果为奇数,则任取3个的最大最小公倍数定为n*(n-1)*(n-2);如果为偶数,取最后四个并从四个取三个求最小公倍数,再从里面取最大的一个。(没给出证明→_→)

然后本人的评测状态如下:


与很多acer一样,没有as掉。问了下室友才知道这题的测试数据错误。。现在还没改。。呐,看下面:



这题真是困扰了我几天。。趁此机会我也玩耍了一番(= =又偷懒了)。

嘛,也巩固了不少知识。甚么求质数,公约数,公倍数的,又重新看了下。这题也用了下优先级队列→_→就是试一下

0 0
原创粉丝点击