这个题目如果用一个一个试的方法会很慢,因为如果输入n=8,则要循环9*10^8次,而且每次循环都要做很多次计算,对于再快的机器,这么大的计算量也不是小数目。所以我认为采用递归的方法比较简便(这是我能想到的最简便的方法,希望能启发你想到更好的方法)。
#include
int x=0,nn;
void fun(long n,int m);
void main(void)
{ int i;
do
{ printf("n=");
scanf("%d",&nn);
}while(nn<0||nn>8); /*如果输入的n超出范围,重新输入*/
for(i=1;i<10;i++)
if(nn!=1) fun((long)i,2); /*所求数的第一位分别取1-9*/
else printf("%d ",x=i);
printf("\n总数:%d\n",x);
getch();
}
void fun(long n,int m) /*第一个参数n为所求数的前m-1位*/
{ long n2;
int m2;
n2=n*10; /*将前m-1位乘10,得到m位的数*/
m2=m*m; /*m2是位数的平方*/
for(;n2%m2&&n2-n*10<10;n2++) ;
/*找到前m-1位为n,且能被m2整除的第一个数*/
for(;n2-n*10<10;n2+=m2)
/*将上一步找到的数逐次加m2,直到前m-1位不为n为止*/
{ if(m==nn) { x++;printf("%ld ",n2); }
/*如果当前数的位数m和输入的位数相等,输出得到的数,并且总数加1*/
else fun(n2,m+1); /*否则,对新得到的数重复上述操作*/
}
}
#include
#include
int sum=0;
void main()
{
int n,count=1,temp4;
printf("input the n:\n");
scanf("%d",&n);//输入位数
int h=n;
double temp1=pow(10,n-1);//保存位数的边界值,此为下限
double temp2=pow(10,n)-1;//此为上限
for(int i=temp1;i<=temp2;i++)//循环求出这些n位数中符合条件的数
{
int temp3=i;//用temp3保存i的值
temp4=temp3;//用临时变量保存temp3的值
if(temp4%(count*count)==0)//条件判断,符合条件的进入条件
{
do{
if(count==n)//某位数符合条件,输出它
{
sum++;
printf("%d ",i);
count=1;//再度初始化计数器count和h以备下个循环使用
h=n;
break;//跳出do..while循环
}
else{
count++;
h--;
temp4=temp3/(pow(10,h-1));
temp4%=(count*count);
}
}while(temp4==0);
}
}
printf("\nthe total is: sum=%d\n",sum);//输出符合条件的个数。
}
int fun(int n)
{
int a[100],j=0;
long m,t;
printf("please input n:");
scanf("%d",n);
m=10^(n+1)-1;
for (;m>10^n-1;m--)
{
t=m;
while (t%(n*n)==0)
{
t/=10;
n--;
if (n==1) break;
}
if (n==1)
a[j++]=m;
}
return j;
}