社区讨论

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:
CPP
int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}

手搓的诡异gcd:
CPP
int 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 条回复,欢迎继续交流。

正在加载回复...