bsp; return 0;
return 1;
}
int check4(int x,int used[10])
{
do {
if(used[x % 10] != 0)
return 0;
used[x%10]++;
} while(x /= 10);
return 1;
}
int main()
{
int a,b,c,i,cnt=0,used[10];
for(c=1023; c <=9876; c++)
{
for (i=0;i<10;i++)
used[i]=0;
if(!check4(c,used))
continue;
for(a=2; a <= 98; a++)
{
if(c % a != 0)
continue;
b = c / a;
if(a > b)
continue;
if(!check(a, b,used))
continue;
cout << a << " * " << b << " = " << c << endl;
cnt++;
}
}
cout << "Count="<<cnt<<endl;
return 0;
}
【例6】排它平方数
小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
请找出具有这样特点的所有6位数。
(1)编程思路。
对6位数进行穷举,区间下限为123456,上限为987654。
定义数组used[10]记录数字0~9的使用情况,分离出穷举的6位数的各位x,且置used[x]++,若每个used[x]大于2,则数字x重复出现,不合要求,进行下次穷举。
另外,由于两个6位数相乘结果超出了整型数的表示范围,采用两个数组元素来保存积。计算6位数i的平方时,将i表示为a*10000+b,这样i的平方等于a*a*100000000+2*a*b*10000+b*b,用数组元素x[1]保存低8位,用x[0]保存高8位,具体方法为:
x[1]=x[1]+c%10000*10000;
x[0]=x[0]+c/10000;
x[0]=x[0]+x[1]/100000000;
x[1]=x[1]%100000000;
然后再检