我的代码是
#include
int main()
{
int a[4]={0},x[4]={0};
int m,n,k,gcd,sum,can=0,i=0,j=0,p=0;
while(~scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]))
{
scanf("%d %d %d %d",&x[0],&x[1],&x[2],&x[3]);
sum=x[0]+x[1]+x[2]+x[3];//这个是为最后剩下的那个x[i]值好计算而设
for(;i<4;i++)//最外层的循环,我的想法是用4X3X2X1那种方法来做,所以这是最外层的a[0]的四种选择
{
if(0==x[i]||0==a[0])//当其中一个为零的时候满足
gcd=0;//gcd是最大公约数
else//下面是最大公约数的求法
{
m=a[0];
n=x[i];
for(k=m%n;k!=0;k=m%n)
{
m=n;
n=k;
}
gcd=n;//得到最大公约数gcd
}
if(1==gcd)//gcd为一的时候不满足,跳出本次循环,换一个x[i]来对应
continue;
else
can++;//can是指这一对能否互相配对,能互相配对则加一
for(;j<4;j++)//到了第二层,这一层的a[1]有三种选择
{
if(i==j)//所选的选手不能相同,所以跳出本次循环,换个人
continue;
if(0==x[j]||0==a[1])//下面这一部分基本同上
gcd=0;
else
{
m=a[1];
n=x[j];
for(k=m%n;k!=0;k=m%n)
{
m=n;
n=k;
}
gcd=n;
}
if(1==gcd)
continue;
else
can++;
for(;p<4;p++)//到了第三层,即a[2]只有两个选择
{
if(i==p||j==p)//以下部分与第二层类似
continue;
if(0==x[p]||0==a[2])
gcd=0;
else
{
m=a[2];
n=x[p];
for(k=m%n;k!=0;k=m%n)
{
m=n;
n=k;
}
gcd=n;
}
if(1==gcd)
continue;
else
can++;
if(0==sum-x[i]-x[j]-x[p]||0==a[3])//最后一层,sum的作用在这里,其他部分基本相同
gcd=0;
else
{
m=a[3];
n=sum-x[i]-x[j]-x[p];
for(k=m%n;k!=0;k=m%n)
{
m=n;
n=k;
}
gcd=n;
}
if(1==gcd)
continue;
else
can++;
if(4==can)//can=4代表以上试的配对方案都可以成功
{
printf("%dvs%d\n",a[0],x[i]);
printf("%dvs%d\n",a[1],x[j]);
printf("%dvs%d\n",a[2],x[p]);
printf("%dvs%d\n",a[3],sum-x[i]-x[j]-x[p]);
break;
}
if(4==can)
break;//之所以有这么多break是因为这一组成功了,根据它的唯一性就可以不用再往下做
}
if(4==can)
break;//因为有很多for所以对应这么多break
}
if(4==can)
break;
}
if(can<4)//没有想出来更好的判断方法,我觉得用can<4可以判断
printf("As we can't.\n");
can=0;//把can归零做下一组输入
}
return 0;
}