六六大顺

某古寺的转经筒上贴有6个小圆圈(如图),每个小圆圈中有一个数字,通过专家长期研究后揭示这6个象征祥瑞的数字呈现“六六大顺”特性:

  • 从任一数字开始,顺时针旋转一周得到一个6位数,在得到的所有6个6位数中,设最小的整数为m,其余5个都是m的倍数

转经筒上的6个小圆圈示意图

试求出转经筒上6个数字的分布及最小的6位整数m;


6个整数

1.说明:

(1)、设置枚举循环

显然整数m的6个数字中不含“0”,否则其余5个数中会出现5位数,同时整数m的首位数字为1,否则m的5个倍数中肯定会出现超过6位数;

因而设置m(123456~198765)枚举循环;

(2)、构造旋转整数

对每一个6位整数m通过k(2~6)循环产生其余5个6位整数:

  • 当k=2时,c=10,d=100000,通过i=m/c;j=m%c;n=j*d+i;产生一个旋转整数

  • 当k=3时,c=100,d=10000,通过i=m/c;j=m%c;n=j*d+i;又产生一个旋转整数

  • · · · · · ·

(3)、判别5个倍数

对每一个产生的旋转整数n,判别是否是m的倍数,若n是m的倍数,用x统计倍数的个数;

(4)、打印输出

最后,若x=5(即有5个倍数),则输出整数m,并依次输出其他5个旋转倍数;

2.程序设计:

#include<stdio.h>
int main()
{
   long c,d,i,j,m,n;
   int k,x;
   for(m=123456;m<=198765;m++)      /*枚举首位为1的6位数*/
   {
      x=0;
      for(c=1,k=2;k<=6;k++)
      {
         c=c*10;
         d=1000000/c;
         i=m/c;
         j=m%c;
         n=j*d+i;          /*产生m的一个旋转整数n*/
         if(n%m==0 && n!=m)     /*统计n是m倍数的个数*/
            x++;
      }
      if(x==5)
      {
         printf("六六大顺数m为:%ld \n",m);
         break;
      }
   }
   for(c=1,k=2;k<=6;k++)
   {
      c=c*10;
      d=1000000/c;
      i=m/c;
      j=m%c;
      n=j*d+i;            /*依次输出m的旋转整数n*/
      printf("m旋转得数:%ld=%ld*%ld \n",n,n/m,m);
   }
}

3.程序运行示例及其注意事项:

六六大顺数m为:142857
m旋转得数:714285=5*142857
m旋转得数:571428=4*142857
m旋转得数:857142=6*142857
m旋转得数:285714=2*142857
m旋转得数:428571=3*142857

由运行可知,满足要求m的5个旋转数都是m的倍数,这样的m是唯一的,也就是说,转经筒上所贴神秘数字序列是唯一的,如图所示:

转经筒上6个数字分布图

顺便指出,以上所得六六大顺数m的7倍更为神奇: 142857*7=999999


延伸探索

1.说明:

自然延伸到一般w个数字是否存在类似特性的w位整数?

或者对一般w个数字,我们放宽要求:

  • 探索在其余w-1个旋转整数中至少存在2个倍数

2.程序设计:

#include<stdio.h>
int main()
{
   long c,d,i,j,m,n,t,p[10];
   int k,w,x;
   printf("请输入位数w:");
   scanf("%d",&w);
   t=1;
   for(k=1;k<=w;k++)
      t=t*10;
   for(m=t/10;m<=t/2;m++)    /*枚举w位数*/
   {
      x=0;
      for(k=0;k<=9;k++)
         p[k]=0;
      for(c=1,k=2;k<=w;k++)
      {
         c=c*10;
         d=t/c;
         i=m/c;
         j=m%c;
         n=j*d+i;         /*n为m的一个换位数*/
         if(n!=m && n%m==0)
         {
            x++;
            p[n/m]=n;
         }
      }
      if(x>=2)
      {
         printf("%ld:  ",m);
         for(k=2;k<=9;k++)
            if(p[k]>0)
               printf("%ld*%ld=%ld ",m,k,p[k]);
         printf("\n");
      }
   }
}

3.程序运行示例及其注意事项:

请输入位数w:6
142857:  142857*2=285714 142857*3=428571 142857*4=571428 142857*5=714285 142857*6=857142
153846:  153846*3=461538 153846*4=615384
230769:  230769*3=692307 230769*4=923076
285714:  285714*2=571428 285714*3=857142

注意:输入位数w为其他值时,没有任何输出,甚至放宽至其余w-1个旋转整数中至少存在一个倍数都没有

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值