제공,
상세한 알고리즘 분석, 소스 코드 및 설명:
문제 분석 및 알고리즘 설계
12파인트 8파인트의 빈 병과 5파인트의 와인이 똑같이 나누어지며, 이는 부정 방정식을 푸는 것으로 추상화될 수 있습니다:
8x-5y=6
의미는 다음과 같습니다. 12파인트 병 8파인트 병에 x회 붓고, 5파인트 병의 내용물을 12파인트 병에 Y회 붓고, 12파인트 병에는 6파인트가 남습니다.
와인.
a, b, c를 이용하여 12파인트, 8파인트, 5파인트 병을 표현하고, 부정방정식의 정수해를 구하는 방법은 부정방정식의 의미에 따라 역산법이다.
a -gt; b -gt; c -gt; a
x y
와인을 따르는 규칙은 다음과 같습니다.
1) a -gt ; b -gt; c -gt; a의 순서
2) b가 비어 있는 경우에만 a에서 가져올 수 있습니다. 3) c가 가득 찼을 때만 a에 부을 수 있습니다.
위의 규칙에 따라 프로그램은 다음과 같이 작성할 수 있습니다.
*프로그램 및 프로그램 설명
#includelt;
void getti (int a, int y, int z)
int i;
void main()
{
int a, y, z
printf("입력 전체 a, 빈 b, c, Get i: "); /*a 가득 찬 병 용량 y: first 첫 번째 빈 병의 용량 z: 두 번째 빈 병의 용량*/
scanf("d, d, d , d", amp; a, amp; y, amp; z, amp; i );
getti(a, y, z); /* a -gt; y -gt; z -를 누르세요. gt; a*/의 작업 단계
getti(a, z, y) /*Press a -gt -gt; >}
void getti(int a, int y, int z) /*a: 가득 찬 병의 용량 y: 첫 번째 빈 병의 용량 z: 두 번째 빈 병의 용량 * /
{
int b=0, c=0; /* b: 첫 번째 병의 실제 무게 c: 두 번째 병의 실제 무게 */
< p> printf(" ad bd cd\n 4d4d4d\n", a, y, z, a, b, c);while(a!=i||b!=iamp;amp; c!=i) /*병이 가득 찼을 때!=i 또는 나머지 두 병이 모두!=i */
{
if(!b)
{ a-=y; b=y;} /*첫 번째 병이 비어 있으면 첫 병에 가득 채웁니다.*/
else if(c==z)
{ a =z; c=0;} /*두 번째 병이 가득 차면 두 번째 병을 가득 찬 병에 붓습니다*/
else if(bgt;z-c ) /*첫 번째 병의 무게가 gt; 두 번째 병의 남은 공간인 경우*/
< p> { b-=(z-c) } /*두 번째 병이 채워집니다. , 나머지 부분은 첫 번째 병에 보관됩니다*/else{ c =b b=0 ;} /* 그렇지 않으면 첫 번째 병을 두 번째 병에 모두 붓습니다*/
printf(" 4d 4d 4d\n", a, b, c)
}
}