问题:
1~9 组成三个 3 位的平方数将 1、2、3、4、5、6、7、8、9 九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一个平方数。
解题思路:
这是解决这个问题的一种简单快速的算法。
首先求出三位数中不包含 0 且是某个整数平方的三位数,这样的三位数是不多的,将其存放到数
组 a 中。然后将满足条件的三位数进行组合,使得所选出的 3 个三位数的 9 个数字没有重复。
#include <iostream>
using namespace std;
int main()
{
int a[20],b[10],num; //a:存放满足条件的三位数
int i,j,k,m,n,s,flag;
int d,e,f;//分别代表百、十、个位数
cout<<"有不同数字的 3 个平方数有:\n";
for(num=0,i=11;i<=31;i++) /*求出是平方数的三位数*/
if(i%10!=0) //若不是 10 的倍数,则分解三位数
{
k=i*i; //分解该三位数中的每一个数字
d=k/100; //百位
e=k/10%10; //十位
f=k%10; //个位
if(!(d==e||d==f||e==f)) //若分解的三位数字均不相等
a[++num]=k; //n:计数器,统计已找到的满足要求的三位数
}
//共有 num 个三位数字均不相等的数保存在 a[1]~a[num]中
for(i=1;i<=num-2;++i) //从满足条件的三位数中选出三个进行组合
{
b[1]=a[i]/100;
b[2]=a[i]/10%10;
b[3]=a[i]%10;
for(j=i+1;j<=num-1;++j)
{
b[4]=a[j]/100; //取第 j 个数的三位数字
b[5]=a[j]/10%10;
b[6]=a[j]%10;
for(k=j+1;k<=num;k++)
{
b[7]=a[k]/100; //取第 k 个数的三位数字
b[8]=a[k]/10%10;
b[9]=a[k]%10;
flag=0; //若 flag 为 1,表示当前 a[i],a[j],a[k]中出现了相同的数字
for(m=1;!flag&&m<=3;m++) //a[i],a[j],a[k]中的三个数字中是否含有相同的数字
for(n=4;!flag&&n<=6;n++)
for(s=7;!flag&&s<=9;s++)
if(b[m]==b[n]||b[n]==b[s]||b[s]==b[m])
flag=1;
if(!flag) /*若均不重复则打印结果*/
cout<<a[i]<<','<<a[j]<<','<<a[k]<<endl;
}
}
}
system("pause");
return 0;
}