平方数的构建

来源:互联网 发布:豆瓣8组 知乎 编辑:程序博客网 时间:2024/05/01 12:43

这是之前师兄问我的面试题,

要求求出1,2,3,4,位数的平方数,组成每一位各不相同的十位数

我用较直观的方法写出的程序,但是效率不是很高,

不过对付1000内的数是绰绰有余了~

 

情况表达:
1 36 784 9025
9 16 784 3025
9 81 324 7056
9 81 576 2304
所以一共有 4 种

 

 //------------------------------------------------------------------
// FileName : 平方数的构建.cpp
// Creator  : 焦祺
// DateTime : 2009-3-8 12:20:10
// Comment  : 一次性编程,或显粗糙
//------------------------------------------------------------------

#include <iostream>
#include <cstring>
using namespace std;
//a[N][]存放位数为N的平方数
int a[5][80] = {0};
int b[5];
int main()
{
 int i,j,k,n,m,t,len,counter=0;
 int j1,j2,j3,j4;
 j1 = j2 = j3 = j4 = 0;
 int k1,k2,k3,k4;
 k1=k2=k3=k4=0;
 char temp[5];
 for (i=1;i<100;i++)
 {
  itoa(i*i,temp,10);
  len = strlen(temp);
 // printf("%d ",len);
  //对位存入
  if(len == 1)
  {
   a[len][j1] = i*i;
   j1++;
  }
  else if (len == 2)
  {
   a[len-1][j1] = -1; //标记最后一位,可能会用到
   a[len][j2] = i*i;
   j2++;
  }
  else if (len == 3)
  {
   a[len-1][j2] = -1; //做标记,可能会用到
   a[len][j3] = i*i;
   j3++;
  }
  else
  { 
   a[len-1][j3] = -1; //做标记,可能会用到
   a[len][j4] = i*i;
   j4++;
  }
 }
 a[len -1][j4] = -1; //做标记,可能会用到
 cout<<"一位数的平方数有:"<<j1<<endl;
 cout<<"二位数的平方数有:"<<j2<<endl;
 cout<<"三位数的平方数有:"<<j3<<endl;
 cout<<"四位数的平方数有:"<<j4<<endl<<endl;
 //有3*6*22*68种可能
 cout<<"情况表达:"<<endl;
 int f[10];
 for (k1=0;k1<j1;k1++)  //kn表示遍历N位时的情况
 {
  for (k2=0;k2<j2;k2++)
  {
   for (k3=0;k3<j3;k3++)
   {
    for (k4=0;k4<j4;k4++)
    {
     memset(f,0,sizeof(f)); //HASH
     for (k=1;k<=4;k++)  //4种情况选某一种
     {
      if(k == 1)   //查看选有几位的数
       j = k1;
      else if (k == 2)
      {
       j = k2;
      }
      else if (k == 3)
      {
       j = k3;
      }
      else if (k == 4)
      {
       j = k4;
      }
      itoa(a[k][j],temp,10); //转为字符型
      b[k] = a[k][j];   //记录可能的情况
      for (i=0;i<strlen(temp);i++)
      {
       if (f[temp[i]-'0'] == 0)
       {
        f[temp[i]-'0'] = 1;  //类似HASH标记
       }
       else
       {
        break;
       }
      }
      if (i != strlen(temp)) //判断for里是否中途跳出了,如果是则跳出
      {
       break;
      }
     }
     if (k==5) //如是没有中途跳出
     {
      counter++;
      for (t=1;t<=4;t++)
       cout<<b[t]<<" ";
      cout<<endl;
     }
    }
   }
  }
 }
 cout<<"所以一共有 "<<counter<<" 种"<<endl;
 return 0;
}