社区讨论
GCD求调
学术版参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lqjljckk
- 此快照首次捕获于
- 2023/12/24 22:40 2 年前
- 此快照最后确认于
- 2023/12/25 14:51 2 年前
刚才在 CF 上写题,用到 gcd, 手搓了一个,结果跑出来 gcd(1, 1) = 0, 吓得我赶紧去 oi-wiki 看了一下 gcd 模板,然鹅模板和我的代码除变量名外一模一样,可是那个 gcd(1, 1) 跑出来是 1,求问为什么。
oi-wiki:
CPPint gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
手搓的诡异gcd:
CPPint gcd_(int x, int y)
{
// printf("gcd_(%d, %d)\n", x, y);
if(y == 0) return x;
return (y, x % y);
}
完整代码(只打了一半):
```cpp
/*
maxv = 3
寻找一个k,使得 gcd(k - a1, k - a2, k - a3..., k - an) 最大
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 2*1e5+10;
int T, n, a[N];
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
int gcd_(int x, int y)
{
printf("gcd_(%d, %d)\n", x, y);
if(y == 0) return x;
return (y, x % y);
}
int abs(int x)
{
return (x > 0) ? x : -x;
}
void init(int &n_)
{
for(int i = 0; i <= n_; i ++)
a[i] = 0;
n_ = 0;
}
int sol()
{
if(n == 1)
return 1;
if(n == 2)
return gcd(a[1], a[2]);
int g = abs(a[1] - a[2]);
int t = abs(a[2] - a[3]);
printf("%d %d : %d\n", g, t, gcd(g, t));
return gcd(g, t);
}
int main()
{
cout << gcd(1, 1) << endl << gcd_(1, 1);
scanf("%d", &T);
while(T --)
{
init(n);
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
printf("%d\n", sol());
}
return 0;
}
CPP回复
共 3 条回复,欢迎继续交流。
正在加载回复...