数学建模社区-数学中国

标题: 一个有趣的数字绕圈问题 [打印本页]

作者: ぐ追ょ寻っ    时间: 2011-12-6 16:34
标题: 一个有趣的数字绕圈问题
未命名.jpg


上面的图形显示的是将数字1-2^n(n=1,2,……)依次按顺时针顺序写在一个圆上,每标一个数字间隔一个。现在问的是按这种规则将上述数字1,2,3,……,2^n-1,2^n排好后,对于任意一个给定的k(1<=k<=2^n),跟它相邻的数字为多少?例如,将1,2,3,……,63,64排好后,53前面的那个数为7,后面的为27,20前面的为39,后面的为40。能否给出一个算法呢?


作者: hopeoflight    时间: 2011-12-7 15:51
正在研究。。。。。
作者: 雪凌寒霜    时间: 2011-12-7 19:27
很有趣的问题,有时间一定试试……
作者: kgyl_168    时间: 2011-12-7 23:38
有趣的问题,顶一个!
作者: duoduoqwe    时间: 2011-12-8 23:02
有趣,有时间看卡
作者: dengbin2009    时间: 2011-12-9 11:16
好,以后试试。。。
作者: ylw346799252    时间: 2011-12-10 09:44
有时间 就研究研究0000000
作者: 小歪歪    时间: 2011-12-10 18:55
类似快速傅里叶算法
作者: yinbaoli    时间: 2011-12-11 02:17
这个问题的确很有趣,不过时间有点晚了,我就把结论通俗的写出来吧(高中知识完全可以解决)
先把k写成二进制形式,具体方法略。
数一下k的二进制数的位数,设为m位;
结论:
若m<n,
(1)k作为10进制数能写成2^n'(n'为正整数)的形式,k的前一数为:2^(n-m)*(2k-1);后一数为2^(n-m)*(2k-1)+1;
(2)否则,k的前一数为:2^(n-m-1)*(2k-1);后一数为2^(n-m-1)*(2k-1)+1;
若m=n,
(1)若k的二进制数的末尾数为“1”,那就从右往左数,计第s位再次出现“1”,那么
k的前一数为:(k-1)/2^s+1/2;后一数为:(k+1)/2;
(2)若k的二进制数的末尾数为“0”,那就从右往左数,计第s位首次出现“1”,那么
k的前一数为:k/2;后一数为:k/2^s+1/2;

如果我没做错的话,这道题应该是彻底解决了,不知道你满不满意~
作者: 锋云天下    时间: 2011-12-11 20:50
有点像折线问题
作者: lhddy123    时间: 2011-12-13 21:42
有什么要求呢?
作者: silalo    时间: 2011-12-14 00:04
很简单的问题,看最外一层的数,看排列顺序,接着相n-1的看,直至。。。
作者: 豪蛋    时间: 2011-12-14 21:19
clear;
clc;
n=input('请输入2的n次方的n值:');
x=input('请输入要查询的数字:');
a=[1 2];
for i=2:n
    b=a;
    for k=1:2:2^i-1
        a(k)=b((k+1)/2);
    end
    for k=2:2:2^i
        a(k)=1+2^(i-1)+k/2-1;
    end
end
m=find(a==x);
disp(sprintf('%d前面的数是:%d',x,a(m-1)));
disp(sprintf('%d后面的数是:%d',x,a(m+1)));




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5