# Visual Studio 2019
# 가장 간단한 정수해를 구하는 프로그램
# 선형방정식 : 미지수의 최고차항의 차수가 1을 넘지 않는 다항 방정식. 변수는 하나일 수도, 둘 이상일 수도 있다.
본문에서는 미지수가 2개(x, y)인 선형방정식을 다루고자 하며, 모두 다음과 같은 꼴로 표현된다.
ax + by = c
이 식은 미지수가 2개이기 때문에, 한 쌍의 근을 구하려면 2개의 식이 필요하다. (연립방정식)
따라서, 이 부정방정식에서 알아낼 수 있는 것은 해들의 일반화 식이다.
부정방정식의 풀이는 해의 형태를 제시하는 게 일반적이다. 정수론에서는 무수한 해 중에서도 '정수해'만을 취급하기로 한다.
# 부정방정식 : 식의 개수보다 미지수의 개수가 많아, 근이 무수히 많은 방정식
예를 들어, 부정방정식 x+y=10 의 해를 구한다고 생각해보자,
순서쌍으로 나타내면 ... (-2,12) (-1,11) (0,10) (1,9) (2,8) ... 로 무수히 많다는 것을 알 수 있다.
('자연수해'로 범위를 축소한다면 유한개의 해를 가질 수 있다)
# 선형방정식의 가장 간단한 정수해 구하기
하나의 정수해를 구하면, 일반화 식을 만들어 낼 수 있다. 선형방정식에서 간단한 정수해를 구하는 프로그램을 작성했다.
여기서 '간단한'은 두 해의 절댓값의 합이 가장 작은 것을 의미한다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int a, b, result;
int cnt1 = 0, cnt2;
printf("Input A, B, result (Ax + By = result) (A < B) \n");
scanf("%d %d %d", &a, &b, &result);
for (int i = a;i < 100000; i += a) {
cnt1 += 1; cnt2 = 1;
for (int j = b;j > -100000;j -= b) {
if (i + j == result) {
printf("%d * %d + %d * %d = %d \n", a, cnt1, b, cnt2, i + j);
exit();
}
cnt2 -= 1;
}
}
getchar();
return 0;
}
단순히 for문을 돌려 간단한 정수해를 찾아내는 프로그램이다.
유의할 점이 있다면 입력 형태에서 A<B 를 맞춰줘야 한다는 점이다. 비교해서 바꾸는 코드를 추가한다면 더 완벽한 프로그램
# 프로그램 이용 예시
(1) 7x + 17y = 60 을 풀고자 한다 (Ctrl + F5)
Input A, B, result (Ax + By = result) (A < B)
7 17 60
7 * 11 + 17 * -1 = 60
(2) 11x + 4y = 21 을 풀고자 한다. 입력 조건이 A<B 이므로 4를 먼저 입력하고 11을 입력해준다.
=> 4x + 11y = 21 을 풀게 되는 것
Input A, B, result (Ax + By = result) (A < B)
4 11 34
4 * 14 + 11 * -2 = 34
(3) 103x + 1001y = 1 을 풀고자 한다. 큰 숫자이다.
이 방정식은 무리없이 계산되지만, 만약 값이 안나온다면 for 문 안의 '100000 / -100000' 를 조정하면 된다.
Input A, B, result (Ax + By = result) (A < B)
103 1001 1
103 * 311 + 1001 * -32 = 1
(5) 2x + 4y = 5 를 풀고자 한다 (Ctrl + F5)
Input A, B, result (Ax + By = result) (A < B)
2 4 5
결과가 나오지 않는다.
숫자가 크지도 않고, A<B 의 조건에도 위배되지 않았는데 왜일까?
그 이유는 바로 정수해가 존재하지 않기 때문이다.
'Programming Language > C, Algorithms' 카테고리의 다른 글
BST 구현 C++ (0) | 2022.11.06 |
---|---|
[C++] 유클리드 호제법 이용, 최대공약수 최소공배수 구하기 (0) | 2022.04.17 |
[C++] 윤년 계산 및 윤년 목록 출력 (0) | 2022.04.17 |
[C/C++] 에라토스테네스의 체를 이용한 소수 출력 (1) (0) | 2020.04.22 |