题意:给定两块巧克力,有两种切法:切一半或者切三分之一,留下三分之二的部分。问需要多少刀能使两块巧克力的面积相同,并输出两块巧克力的规格。
因为面积相同所以两个巧克力长宽乘积分解出来的质因数应该是一样的,因为我们可以有两种切法,所以我们能把多出来2变没了,我们也能把3变成2(因为切三分之一留三分之二),所以对于初始的两个面积,我们先分解质因数,比较一下除了二三以外的其他质因数有没有数量上的不同,有的话直接-1,没有的话就先比较3的个数,3的个数多了就变成2,在比较2,2的个数多了直接变为1也就是删除了,在变化过程中我们要对长宽进行变化,最后输出就好。
#include <stdio.h>
#include <math.h>
#include <string.h>
void ok3 (int &a,int &b,int c)
{
while (c--)
{
if (a%3==0)
a=a/3*2;
else b=b/3*2;
}
}
void ok2(int &a,int &b,int c)
{
while (c--)
{
if (a%2==0)
a=a/2;
else b=b/2;
}
}
int main ()
{
int x1,y1,x2,y2;
int q,w,c,d;
int num1,num2;
int a[100];
int b[100];
scanf ("%d%d%d%d",&x1,&y1,&x2,&y2);
q=x1;
w=y1;
c=x2;
d=y2;
memset (a,0,sizeof (a));
memset (b,0,sizeof (b));
while (x1%2==0||x2%2==0||y1%2==0||y2%2==0)
{
if (x1%2==0)
{
a[0]++;
x1/=2;
}
if (y1%2==0)
{
a[0]++;
y1/=2;
}
if (x2%2==0)
{
b[0]++;
x2/=2;
}
if (y2%2==0)
{
b[0]++;
y2/=2;
}
}
while (x1%3==0||x2%3==0||y1%3==0||y2%3==0)
{
if (x1%3==0)
{
a[1]++;
x1/=3;
}
if (y1%3==0)
{
a[1]++;
y1/=3;
}
if (x2%3==0)
{
b[1]++;
x2/=3;
}
if (y2%3==0)
{
b[1]++;
y2/=3;
}
}
if (x1*y1!=x2*y2)
{
printf ("-1\n");
}
else
{
num1=a[0]+a[1];
num2=b[0]+b[1];
int ans=0;
if (a[1]>b[1])
{
ans+=a[1]-b[1];
ok3(q,w,a[1]-b[1]);
a[0]+=a[1]-b[1];
a[1]=b[1];
}
if (b[1]>a[1])
{
ans+=b[1]-a[1];
ok3(c,d,b[1]-a[1]);
b[0]+=b[1]-a[1];
b[1]=a[1];
}
if (a[0]>b[0])
{
ans+=a[0]-b[0];
ok2(q,w,a[0]-b[0]);
}
if (a[0]<b[0])
{
ans+=b[0]-a[0];
ok2(c,d,b[0]-a[0]);
}
printf ("%d\n%d %d\n%d %d\n",ans,q,w,c,d);
}
return 0;
}