关闭

六六大顺

标签: 六六大顺c语言程序
82人阅读 评论(0) 收藏 举报
分类:

某古寺的转经筒上贴有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个旋转整数中至少存在一个倍数都没有

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12623次
    • 积分:867
    • 等级:
    • 排名:千里之外
    • 原创:73篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章存档
    最新评论