称 不含重复数字的完全平方数 为巧妙平方数。
试在 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 中任意个位数的全排列巧妙平方数。