이 문제에서 x와 y의 용량과 무한한 물의 공급을 가진 두 개의 용기가 주어졌습니다. 우리의 임무는 한 용기에서 정확히 1리터를 계산할 수 있는 프로그램을 만드는 것입니다. x와 y가 공소수라는 조건이 주어집니다. 공동 프라임 상대 소수, 상호 소수라고도 합니다. 1이 유일한 공약수인 두 수입니다. 따라서 이는 gcd(최대공약수 )은 1입니다.
여기에 용량 x의 V1 선박과 용량 y의 V2 선박이 있다고 가정해 보겠습니다. 이 두 용기를 사용하여 1리터를 측정하기 위해 우리는 물 공급에서 첫 번째 용기를 채운 다음 두 번째 용기에 부을 것입니다. V1 용기에 1리터의 물이 포함될 때까지 이 과정을 계속하십시오.
문제를 이해하기 위해 예를 들어보겠습니다.
입력 -
V1 = 5, V2 = 8 V1 = 5 ; V2 = 0 -> pour water from V1 to V2 and refill it. V1 = 5 ; V2 = 5 -> pour water from V1 to V2 and refill it. V1 = 2 ; V2 = 0 -> pour water from V1 to V2. Now, V2 is filled, empty it. V1 = 5 ; V2 = 2 -> pour water from V1 to V2 and refill it. V1 = 5 ; V2 = 7 -> pour water from V1 to V2 and refill it. V1 = 4 ; V2 = 0 -> pour water from V1 to V2. Now, V2 is filled, empty it. V1 = 1 ; V2 = 0 -> pour water from V1 to V2 and refill it. Here, V1 measures 1 litre of water.
예시
솔루션을 설명하는 프로그램,
#include <iostream> using namespace std; int x, y, V1, V2 = 0; int transferWater(int amt1, int amt2) { if (amt1 + amt2 < y){ V2 += V1; return V1; } int transferred = y - V2; V2 = 0; return transferred; } void measure1Litre() { while(V1 != 1){ if (V1 == 0) V1 = x; cout<<"Vessel 1: "<<V1<<" | Vessel 2: "<<V2<<endl; V1 = V1 - transferWater(V1, V2); } cout<<"Vessel 1: "<<V1<<" | Vessel 2: "<<V2<<endl; } int main() { x= 5, y = 8; measure1Litre(); return 0; }
출력
Vessel 1: 5 | Vessel 2: 0 Vessel 1: 5 | Vessel 2: 5 Vessel 1: 2 | Vessel 2: 0 Vessel 1: 5 | Vessel 2: 2 Vessel 1: 5 | Vessel 2: 7 Vessel 1: 4 | Vessel 2: 0 Vessel 1: 5 | Vessel 2: 4 Vessel 1: 1 | Vessel 2: 0