某古寺的转经筒上贴有6个小圆圈(如图),每个小圆圈中有一个数字,通过专家长期研究后揭示这6个象征祥瑞的数字呈现“六六大顺”特性:
- 从任一数字开始,顺时针旋转一周得到一个6位数,在得到的所有6个6位数中,设最小的整数为m,其余5个都是m的倍数;
试求出转经筒上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是唯一的,也就是说,转经筒上所贴神秘数字序列是唯一的,如图所示:
顺便指出,以上所得六六大顺数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个旋转整数中至少存在一个倍数都没有;