要点分析:
1.x的取值范围应当是10000~sqrt(987654321);
2.用一个十位一维数组,用序号位来判定数字是否出现过,即每个数组元素分别为序号位对应的数字的flag;
3.每一次最外循环都要把数组和数字出现计数的变量重置。
编码器:vs2019
#include<stdio.h>
#include<math.h>
int main()
{
long X1[10], x, k = 0, y, y2;
int i, t, n = 0;
for (x = 10000; x < sqrt(987654321); x++)
{
for (i = 0; i < 9; i++)
{
X1[i] = 0;/*将数组中九位全部置为0,即把每一个数组元素作为对应位数的flag
*且每一次最外循环都要把X[]和k重置*/
}
y2 = y = x * x;
k = 0;
for (i = 0; i < 9; i++)
{
t = y2 % 10;/*取每一位的数字*/
y2 = y2 / 10;
if (X1[t] == 0)/*数字t对应的数组位等于0,则表示该数字t第一次出现*/
{
k++;/*对九位数字做计数*/
X1[t] = 1;/*置为1表示该数字出现过了*/
}
if (k == 9)
{
printf("%ld^2=%ld\t", x, y);
n++;
if (n % 3 == 0)
{
printf("\n");
}
}
}
}
}