巧妙平方数

不含重复数字的完全平方数 为巧妙平方数。

试在 1,2,…,9 这9个数字中选出m个,组成巧妙平方数。

1.说明:
计算最小的m位数10^(m-1)开平方取整数t1,最大的m位数(10^m)-1开平方取整数t2,以t1+1和t2作为循环的初值与终值设置y循环;
检验m位平方数 f=y*y,经m次求余分离 f 的每一位数字k,若k=0,即 f 含数字0,返回;设置b数组,应用b(k)统计数字k的个数,若b(k)>1,即 f 中含有重复数字,返回;
经检验若 f 不含数字0,也没有重复数字,则打印输出。

2.程序设计:

#include
#include
int main()
{
   int k,n,m,i,x,b[10];
   long t,t1,t2,y,d,f;
   printf("在1,2,... ,9这9个数字选m个,");
   printf("组合成没有重复数字的平方数。\n");
   printf("请输入平方数的位数m:");
      scanf("%d",&m);
   n=0;
   t=1;
   for(y=1;y1)
         {
            x=1;   /*含数字0或重复数字则记x=1*/
            break;
         }
      }
      if(x==0)
      {
         n++;
         printf("   %ld=%d^2",d,y);
         if(n%3==0)
            printf("\n");
      }
   }
   printf("\n这样的平方数共%d个。\n",n);
}

3.程序运行示例及其变通:

在1,2,...,9这9个数字选m个,组合成没有重复数字的平方数。
请输入平方数的位数m:9
139854276=11826^2   152843769=12363^2   157326849=12543^2
215384976=14676^2   245893761=15681^2   254817369=15963^2
326597184=18072^2   361874529=19023^2   375468129=19377^2
382945761=19569^2   385297641=19629^2   412739856=20316^2
523814769=22887^2   529874361=23019^2   537219684=23178^2
549386721=23439^2   587432169=24237^2   589324176=24276^2
597362481=24441^2   615387249=24807^2   627953481=25059^2
653927184=25572^2   672935481=25941^2   697435281=26409^2
714653289=26733^2   735982641=27129^2   743816529=27273^2
842973156=29034^2   847159236=29106^2   923187456=30384^2

这样的平方数共30个。

变通:若允许含有数字”0“,请修改程序搜索m位巧妙平方数。

全排列中的巧妙平方数

在2、3、5、6、7、8、9这7个数字的全排列中有多少个平方数,试输出所有这些平方数。

1.说明:
7个数字的全排列位7位数,求出最小7位数的平方根b和最大7位数的平方根c;
用a枚举 [b,c] 中的所有整数,计算d=a*a,这样确保所求平方数在d中;
设置 f 数组统计d中各数字的个数,若果 f[3]=2 ,即平方数d中有2个”3“;
检测,若 f[k]>1(k=0~9),说明d中存在有重复数字,返回;
在不存在重复数字的情形下检测,若 f[0]+f[1]+f[4]=0 ,说明7位平方数d中没有数字0、1、4,d满足题意要求,打印输出。

2.程序设计:

#include
#include
int main()
{
   int k,m,n,t,f[10];
   long a,b,c,d,w;
   printf("数字2、3、5、6、7、8、9的全排列中的平方数:\n");
   n=0;
   b=(long)sqrt(2356789);
   c=(long)sqrt(9876532);
   for(a=b;a<=c;a++)
   {
      d=a*a;
      w=d;
      for(k=0;k<=9;k++)
         f[k]=0;
      while(w>0)
      {
         m=w%10;
         f[m]++;
         w=w/10;
      }
      for(t=0,k=1;k<=9;k++)
         if(f[k]>1)
            t=1;
      if(t==0&&f[0]+f[1]+f[4]==0)
      {
         n++;
         printf("%4d:",n);
         printf("%ld=%ld^2\n",d,a);
      }
   }
   printf("共可组成以上%d个。\n",n);
}

3.程序运行示例及其变通:

数字2、3、5、6、7、8、9的全排列中的平方数:
  1:3297856=1816^2
  2:3857296=1964^2
  3:5827396=2414^2
  4:6385729=2527^2
  5:8567329=2927^2
  6:9572836=3094^2
共可组成以上6个。

变通:根据该实例可以拓展到求 0~9 中任意个位数的全排列巧妙平方数。

你可能感兴趣的:(致美C程序,特殊整数)