问题:平方后低位的数恰好等于该数的数是同构数。求小于10000的所有同构数。
编译环境:vc6.0
#include<stdio.h>
#include<math.h> //调用 pow()函数。
void main()
{
int n,i,m,k; //定义:n为位数,i为循环数,
//m和k为i的平方数(两者用途不同,k可以用i*i代替)。
for(i = 1;i <= 10000;i++){ //循环。(范围为1~10000,可修改)
k = i * i;
n = 1; //当平方数小于1时,位数为1.
m = k;
while(m >= 10) {n++;m /= 10;} //算平方数的位数。
if(n % 2 == 0){ //当平方数的位数为偶数时。
//注:此处大括号不可去,否则第二个if会与else对齐。
if(i == k % (int)pow(10,(n / 2))) //判断 i 是否等于 平方数 对 低位的数 取得的余数。
printf("%d\n",i);} //输出 i ,若想在输出平方数,则加上 k 即可。
else{ //当平方数的位数为奇数时。注:此处大括号可去。
if(i == k % (int)pow(10,((n + 1) / 2)))
printf("%d\n",i);}
} system("pause"); //vc6.0 需在for循环后加上 system("pause");
}
关于这一行代码:
if(i == k % (int)pow(10,(n / 2)))
1、k可以用 i*i 代替。
2、取余符号 % 不能用于浮点数,只能用于整数。
3、pow()函数在vc6.0里原型为 double pow( double x, double y ); 返回值为double类型,故需要转化为int型。
4、代码的意思是 先计算平方数 i*i 的低位位数(即把平方数 向上取 对半分,分为高位数和低位数两部分,比如数 964852 的低位数为 852,位数即3,;数26547 的低位数为 547 ,位数即 3),然后对平方数对 10 的低位位数次幂 取余(比如当 k 为 3264 时,取余后为 64,低位位数次幂为 2),最后与 i 相比较。
5、这里的pow()函数可用 e+... 来表示10的n次方。
代码运算结果为: