1~9组成三个3位的平方数
将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,
即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,
要求每组中的三位数都组成一个平方数。
算法分析:
本题利用的也是穷举,三个数的初始值最小是11,最大是31,但是11、12的平方明显有重复的,所以直接从13开始,然后就是分离各个位数,最后整合检验三个三位数的组成之中有没有相同的,含零的
#include<stdio.h>
int fun(int a[], int n)
{
int i, j;
for(i = 0; i < n-1; i++)
for(j = i+1; j < n; j++)
{
if(a[i]==a[j]||a[j]==0)//让每两个数都比教一次,如果发现有
return 0; //相同的或某个数值为零则这组数有问题
}
if(i == n-2&&j==n-1) //当i等于倒数第二个数,j等于最后一个数时
{ //说明所有的数都遍历了一遍
return 1;
}
}
main()
{
int a[9],i,j,k,temp;
for(i = 13; i <= 31; i++)
for(j = 13; j <= 31; j++)
for(k = 13; k <= 31; k++)
{
if(i!=j&&i!=k&&j!=k&&i%10!=0&&j%10!=0&&k%10!=0)
{ //这里避免i,j,k相同,并且去掉20,30
temp = i*i; //设置临时变量将i的值赋给他
for(int x = 0; x < 9; x++) //将各个位数分离出来存储在数组之中
{
a[x] = temp%10;
temp /= 10;
if(temp==0&&x==2)
temp = j*j;
if(temp==0&&x==5)
temp = k*k;
}
if(fun(a,9)!=0)//一旦找到立马结束程序
{
printf("%d %d %d\n",i*i,j*j,k*k);
return 0;
}
}
}
}