标题:这段代码看不懂,书上的解释没看懂。
只看楼主
时光隧道wmc
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2016-3-28
结帖率:100%
已结贴  问题点数:16 回复次数:4 
这段代码看不懂,书上的解释没看懂。
int main()
{
  long mul,number,k,ll,kk;
  printf("It exists following automorphic nmbers small than 200000: ");
  for(number=0;number<200000;number++)
  {
    for(mul=number,k=1;(mul/=10)>0;k*=10);这里
   
    kk=k*10;
    mul=0;
    ll=10;
    while(k>0)
    {
      mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;这里
     
      k/=10;
      ll*=10;
    }
    if(number==mul)
    printf("%ld ",number);
  }
}
搜索更多相关主题的帖子: following number 
2016-05-04 10:08
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:8 
能先 把函数的功能或书上的解释简单说一下不
2016-05-04 10:21
时光隧道wmc
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2016-3-28
得分:0 
回复 2楼 grmmylbs
求自守数,
若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计算机无法表示过大的整数。
分析手工方式下整数平方(乘法)的计算过程,以376为例:
376 被乘数
× 376 乘数
----------
2256 第一个部分积=被乘数*乘数的倒数第一位  (376*6)
2632 第二个部分积=被乘数*乘数的倒数第二位  (376*7)
1128 第三个部分积=被乘数*乘数的倒数第三位  (376*3)

----------
141376 积

本问题所关心的是积的最后三位。分析产生积的后三位的过程,可以看出,在每一次的部分积中,并不是它的每一位都会对积的后三位产生影响。总结规律可以得到:在三位数乘法中,对积的后三位产生影响的部分积分别为:
第一个部分积中:被乘数最后三位*乘数的倒数第一位
第二个部分积中:被乘数最后二位*乘数的倒数第二位
第三个部分积中:被乘数最后一位*乘数的倒数第三位
将以上的部分积的后三位求和后截取后三位就是三位数乘积的后三位。这样的规律可以推广到同样问题的不同位数乘积。
按照手工计算的过程可以设计算法编写程序。
 

怎么求自守数,但一到程序上,分析每一步,就看不懂了。吧他拆成一步一步的,就看不懂。
2016-05-04 10:59
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
for(mul=number,k=1;(mul/=10)>0;k*=10);这里
这一句就是为了求number的位数k,1位数k是1;2位数k是10;3位数k是100......
下面的循环while(k>0)就是根据位数来求每次乘积的和
程序代码:
       a b c d e
    × a b c d e
    ----------------
     a b c d e × e                                            -------第一次循环的mul
   +   b c d e × d × 10                                 -------和就是第二次循环的mul
   +     c d e × c × 100              -------和就是第三次循环的mul
   +       d e × b × 1000             -------和就是第四次循环的mul
   +         e × a × 10000            -------和就是第五次循环的mul
2016-05-04 11:35
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:8 
程序代码:
#include<stdio.h>

main()
{
    int nn = 100000000;
    int n;
    for (n=1; n<nn; n++)
    {
        int n2 = n;
        int m = 0;
        for (;;)
        {
            if (n2 == 0)
            {
                printf("%d\n", n);
                break;
            }
            int k = n2 % 10;
            m += k * n;
            if (m%10 != k)
            {
                break;
            }
            m = m / 10;
            n2 = n2/10;
        }
    }
}
2016-05-04 22:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-464373-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.179138 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved