• C语言之自守数


    自守数

         自守数是指一个数的平方的尾数等于该数自身的自然数,如25*25=625,76*76=5776.要求求出一定范围内的所有自守数。

    题目分析:

    刚拿到这个题目的时候认为解题关键在于,测试该数平方数的尾数和该数自身的自然数相等问题。导出新问题如何求出该平方数的尾数,要取和自然数位数相同的位数该怎么取。

    看了一下标准答案如下,表示细节方面看不懂,贴出如下:

    1. #include<stdio.h>
    2. int main(void)
    3. {
    4. long i, j, k1, k2, k3, a[10] = {0}, num, m, n, sum;            /*定义变量及数组为长整形*/
    5. printf("请输入一个数表示范围: ");
    6. scanf("%ld", &num);                        /*从键盘中输入要求的范围*/
    7. printf("结果是:");
    8. for (j = 0; j < num; j++)                 /*对该范围内的数逐个试探*/
    9. {
    10. m = j;
    11. n = 1;
    12. sum = 0;
    13. k1 = 10;
    14. k2 = 1;
    15. while (m != 0)                        /*判断该数的位数*/
    16. {
    17. a[n] = j % k1;                     /*分离出的数存入数组中*/
    18. n++;                                 /*记录位数,实际位数为n-1*/
    19. k1 *= 10;                            /*最小n位数*/
    20. m = m / 10;
    21. }
    22. k1 = k1 / 10;
    23. k3 = k1;
    24. for (i = 1; i <= n - 1; i++)
    25. {
    26. sum += (a[i] / k2 * a[n - i]) % k1 * k2;                 /*求每一部分积之和*/
    27. k2 *= 10;
    28. k1 /= 10;
    29. }
    30. sum = sum % k3;                     /*求和的后n-1位*/
    31. if (sum == j)
    32. printf("%5ld", sum);                /*输出找到的自守数*/
    33. }
    34. printf(" ");
    35. return 0;
    36. }

    效果图如下:

    不过看到数组后产生灵感,想了个办法用while循环结合一个变量来统计自然数的位数,然后求出10的位数平方,用平方数对其求余再和自然数比较,并采用了模块化设计。

    代码如下:

    1. #include<stdio.h>
    2. int ss(long);
    3. int main(void)
    4. {
    5. int i;
    6. long sum;
    7. scanf("%ld",&sum);
    8. for(i=0;i<=sum;i++)
    9. {
    10. if(ss(i))                                         //判断是否符合要求
    11. printf("%d ",i);
    12. }
    13. printf(" ");
    14. return 0;
    15. }
    16. int ss(long value)
    17. {
    18. int i,n=0,k=1;
    19. long temp=value,result;               //用long型防止溢出,用一个temp来复制变量,保留一个原样。
    20. long ch=value*value;                  //求平方数
    21. while(temp!=0)     
    22. {
    23. n++;                                        //统计自然数的位数
    24. temp/=10;
    25. }
    26. for(i=0;i<n;i++)
    27. k=k*10;                                  //求出取余的数
    28. result=ch%k;                          //求余
    29. if(value==result)                      //测试
    30. return 1;
    31. return 0;
    32. }

    效果图如下:

    个人觉得对比给出的标准答案改进有
    一、代码行数减少了
    二、进行了模块化设计
    三、未使用数组
    四、更易理解

  • 相关阅读:
    js难点之闭包理解
    rank() | dense_rank() | row_number() over(PARTITION BY sex order by age desc ) 的区别
    浏览器名称和版本判断
    Cookie与Session的初探
    ASP.NET基础系列
    ECharts使用
    java-保留x个小数位
    HttpServletResponse和HttpServletRequest
    java-socket通信
    java-序列化
  • 原文地址:https://www.cnblogs.com/tuifeideyouran/p/3151656.html
Copyright © 2020-2023  润新知