1148: 组合三位数之一
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 982 Solved: 665
Submit Status Web Board
Description
把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
Input
无
Output
按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。
Sample Input
Sample Output
HINT
Source
#include<iostream>
using namespace std;
int main ()
{
int tem = 0 ;
int tval[3] = {0} ;
int a[21][3] = {0} ; //32-11=21
int n = 0 ;
int itest[9] = {0};
for (int i=11;i!=32;i++)
{
tem = i * i ;
for (int j=2;j>=0;j--) //反转使得个位数在数组的末位
{
tval[j]= tem % 10;
tem /=10;
}
if (tval[0]==tval[1] || tval[1]==tval[2] || tval[0]==tval[2])
continue; //满足if时继续执行两个for语句,直到检索出个、十、百位为不同的三位数
//不满足if时执行continue以下的语句
a[n][0] = tval[0];
a[n][1] = tval[1];
a[n][2] = tval[2];
n++; //不满足if的三位数的个数
}
/* for ( i=0 ; i!=n ; i++)
{
cout<<a[i][0]<<a[i][1]<<a[i][2]<<endl;
}
*/
//检索满足题意的三组数,从1,2,3,4,5,6,7,8,9中每个数只能使用一次
for (int k=0 ; k!= n-2 ; k++)
{
for (int t=k+1 ; t != n-1 ; t++)
{
for (int m=t+1 ; m != n; m++)
{
itest[ a[k][0] - 1 ] = 1;
itest[ a[k][1] - 1 ] = 1;
itest[ a[k][2] - 1 ] = 1;
itest[ a[t][0] - 1 ] = 1;
itest[ a[t][1] - 1 ] = 1;
itest[ a[t][2] - 1 ] = 1;
itest[ a[m][0] - 1 ] = 1;
itest[ a[m][1] - 1 ] = 1;
itest[ a[m][2] - 1 ] = 1;
for (int i=0;i<9;i++)
{
if (itest[i] != 1)//漏掉结果使得不等于一
break; //终止循环从头再来
if ( i==8 ) //循环到i==8,说明找到了满足题意的三组数
{
cout<<a[k][0]<<a[k][1]<<a[k][2]<<" "
<<a[t][0]<<a[t][1]<<a[t][2]<<" "
<<a[m][0]<<a[m][1]<<a[m][2]<<endl;
}
}
for (int j=0 ; j!=9 ; j++) //使得运行出来的所有结果个十百位属于1~9个数当中的三个
{
itest[j]=0; //运行出来的置为0
}
}
}
}
return 0;
}
#include<stdio.h> //暴力法检索出所有的三位数#include<math.h>int a[100] ;#define N 10void sanwei (){ int i,j,k; for (i=1;i<N;i++) { int first=i; for (j=1;j<N;j++) { if (j==i) continue; first*=10; first+=j; for (k=1;k<N;k++) { if (k==i || k==j) continue; first*=10; first+=k; int it=(int)sqrt(first); if ( it*it==first ) { printf("%d ",first); } first-=k; first/=10; } first-=j; first/=10; } }}int main (){ sanwei(); return 0;}