目录
1148:题目描述
把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
输入
无
输出
按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。
答案:
(代码错误,增加要求为输出其中最大的三个数字,要求该三位数字1-9仅使用一次)
#include<stdio.h>
int main()
{
int x,y,z,m,n,a[13][3],b[9],j,k,p=0;
for(x=1; x<10; x++)
for(y=1; y<10; y++)
for(z=1; z<10; z++)
if(x!=y && x!=z && y!=z)
{
n=x*100+y*10+z;
m=1;
while (m*m<=n)
{
if (m*m==n)//从1开始,到平方和 >n结束 平方和=n为符合条件 的数字(n)
{
//找到所有符合条件的数字,存入数组a中
a[p][0]=x;
a[p][1]=y;
a[p++][2]=z;
printf("%d",a[p-1][0]);
printf("%d",a[p-1][1]);
printf("%d\n",a[p-1][2]);
}
m++;
}
}
fx(p-1,1,a);
// m=fx(p-1,1,a)/10;
// n=fx(p-1,1,a)%10;
// printf("\n\n%d%d%d\n",a[12][0],a[12][1],a[12][2]);
// printf("%d%d%d\n",a[m][0],a[m][1],a[m][2]);
// printf("%d%d%d\n",a[n][0],a[n][1],a[n][2]);
}
int fx(int p,int y,int a[13][3])
{
int x,i,j,k,m,n,q=p,z=y;
while(1)
{
x=0;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
if(a[p][i]!=a[p-y][j])
x++;
if(x==9)
break;
y++;
}
m=p-y;//第二大的不同数所在行数
printf("%d",m);
y=1;
p=m;
while(1)
{
x=0;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
if(a[p][i]!=a[p-y][j])
x++;
if(x==9)
{
k=0;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
if(a[q][i]!=a[p-y][j])
k++;
if(k==9)
break;
}
y++;
}
n=p-y;//最后一个数字
printf("%d\n",n);
while(n<0)
{
fx(q,q-m+1,a);
if(m<0)
break;
}
while(m<0)
{
fx(--q,1,a);
if(q<=0)
break;
}
printf("\n%d%d",m,n);
return m*10+n;
}
ps:
思路:先把数字存储到二维数组中,然后按行列比较是否相同
要最大的三个不同数字
倒着从最后一行开始(第12行)
先锁定p=12(数组已经从小到大排序,第12行为最大的数字),和p-y比较(y=1),y++,寻找和p行完全不同的数字,记录行数(第二大的不同数字,记为第m行),然后再锁定m行,和m-y比较(y=1),最后寻找到和m,p行都不同的数字,记录为第n行。
如果n<0(该数不存在),则m向上移动一个,后重新寻找n(p不动)。
如果m<0(该数不存在),则p向上移动一个,然后重新寻找m和n。