C语言20行代码求小于等于10000的所有同构数。

问题:平方后低位的数恰好等于该数的数是同构数。求小于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次方。

代码运算结果为:



猜你喜欢

转载自blog.csdn.net/Higashino_Keigo/article/details/79945984