Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

EuclidProblem/이동현: Difference between revisions

From ZeroWiki
imported>Unknown
No edit summary
 
(Repair batch-0002 pages from live compare)
 
Line 9: Line 9:
  using namespace std;
  using namespace std;
  long Eucl(long, long);
  long Eucl(long, long);
  long xy[2][2] = {{0,0},{0,1}};
  long xy[2][2] = {{0,0},{0,1}};
  int main(void){
  int main(void){
  long a, b, gcd;
  long a, b, gcd;
Line 20: Line 20:
  gcd = Eucl(a,b);
  gcd = Eucl(a,b);
  if(isSwap==true)
  if(isSwap==true)
  swap(xy[1][0],xy[1][1]);
  swap(xy[1][0],xy[1][1]);
  cout << xy[1][0] << " " << xy[1][1] << " " << gcd <<"\n";
  cout << xy[1][0] << " " << xy[1][1] << " " << gcd <<"\n";
  return 0;
  return 0;
  }
  }
Line 28: Line 28:
  return b;
  return b;
  long q = (a - a%b)/b;
  long q = (a - a%b)/b;
  long tx = xy[0][0], ty = xy[0][1];
  long tx = xy[0][0], ty = xy[0][1];
  xy[0][0] = xy[1][0];
  xy[0][0] = xy[1][0];
  xy[0][1] = xy[1][1];
  xy[0][1] = xy[1][1];
  if(tx==0 && ty==0){//첫시도라면
  if(tx==0 && ty==0){//첫시도라면
  xy[1][0] = 1, xy[1][1] = q*-1; //첫함수진입에서 a의 계수는 언제나 1이다.
  xy[1][0] = 1, xy[1][1] = q*-1; //첫함수진입에서 a의 계수는 언제나 1이다.
  }
  }
  else{
  else{
  xy[1][0] = xy[0][0]*-1*q+tx; //이번함수의 몫q*-1을 곱하고 이전이전함수의 계수를 더한다.
  xy[1][0] = xy[0][0]*-1*q+tx; //이번함수의 몫q*-1을 곱하고 이전이전함수의 계수를 더한다.
  xy[1][1] = xy[0][1]*-1*q+ty;
  xy[1][1] = xy[0][1]*-1*q+ty;
  }
  }
  return Eucl(b, a%b);
  return Eucl(b, a%b);
Line 42: Line 42:
==== 나한테 할 말 ====
==== 나한테 할 말 ====
----
----

Latest revision as of 00:16, 27 March 2026

소감

문제가 있길래 한번 도전해봤습니다. 참여하는데 다른 룰이 있는 것 인지 모르겠군요. 유클리드호제법을 까먹어서 고등학교 정석책을 참고 ^^ X, Y를 구하는 코드와 최대공약수를 구하는 코드를 합치는데 시간이 걸렸습니다.

코드

//Euclid Problem/이동현 2005.04.03
#include <iostream>
using namespace std;
long Eucl(long, long);
long xy[2][2] = {{0,0},{0,1}};
int main(void){	
	long a, b, gcd;	
	cin >> a >> b;
	bool isSwap = false;	
	if(a<b){	//a는 무조건 큰수를 넣는다.
		isSwap = true;
		swap(a, b);
	}
	gcd = Eucl(a,b);	
	if(isSwap==true)
		swap(xy[1][0],xy[1][1]);
	cout << xy[1][0] << " " << xy[1][1]  << " " << gcd <<"\n";
	return 0;
}
long Eucl(long a, long b){	//a가 큰수. a=bq+r공식을 변형 r=a-qb 을 이용하여 a,b의 계수 계산
	if(a%b == 0)			
		return b;
	long q = (a - a%b)/b;
	long tx = xy[0][0], ty = xy[0][1];
	xy[0][0] = xy[1][0];
	xy[0][1] = xy[1][1];
	if(tx==0 && ty==0){//첫시도라면
		xy[1][0] = 1, xy[1][1] = q*-1;	//첫함수진입에서 a의 계수는 언제나 1이다.
	}
	else{
		xy[1][0] = xy[0][0]*-1*q+tx; //이번함수의 몫q*-1을 곱하고 이전이전함수의 계수를 더한다.
		xy[1][1] = xy[0][1]*-1*q+ty;
	}
	return Eucl(b, a%b);
}

나한테 할 말