`
抛出异常的爱
  • 浏览: 627954 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

3x+1问题

阅读更多
今天看到一个题在入门版.....
http://www.iteye.com/topic/728160
挪过来看看.

Crusader 写道
3x+1问题,它描述的是这样一个现象:
任取一个自然数,如果它是偶数,就把它除以2,如果它是奇数,就把它乘3再加上1。如此,就得到了一个新的自然数。再按照上述规则反复操作新产生的自然数,我们就会得到一串自然数,而最终得到的自然数序列将陷在4→2→1这个循环中。。。

如 5→16→8→4→2→1→4→2→1。。。
     7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1→4→2→1。。。

这个猜想目前还无法证明,只能穷举,最闲的人已经验证到100*2的50次方。。。

运行的时候,循环改小点,否则估计要运行1千万年左右,应该都活不到那么长吧...
public class _3X1 {
		
	// 是否奇数
	private static boolean isOdd(long i){
		return (i&1L)==1L;
	}
	
	// 判断是否4 | 2 | 1
	private static boolean is_4_2_1(long i){
		return i==4 || i==2 || i==1;
	}
	
	// 判断是否2的次方,如果是,直接断定满足3x+1
	private static boolean isPower2(long i){
		int count = 0;
		while(i>0 && count<2){
			i = i & (i-1L);
			count++;
		}
		return count==1;
	}
	
	// 满足3x+1猜想则返回true,否则死循环
	public static boolean _3x1(long i){
			int flag = 0;
			while(flag<3){
				// 如果是奇数
				if(isOdd(i)){
					i = i*3L+1L;				
				// 如果是偶数
				}else{
					i >>= 1;		
				}
				
				if(is_4_2_1(i)){
					flag++;
				}else{
					flag=0;
				}
			}

		return true;
	}
	
	public static void main(String[] args) {

		for(long i=1; i<Long.MAX_VALUE; i++){

			if(isPower2(i) || _3x1(i)){
				System.out.println(i);
			}

		}

	}

}

分享到:
评论
6 楼 Crusader 2010-08-06  
抛出异常的爱 写道
不加sysout
用时:1047
你可以试试你的机器上多少
public class _3X1 {  
          
    // 是否奇数  
    private static boolean isOdd(long i){  
        return (i&1L)==1L;  
    }  
       
    // 判断是否2的次方,如果是,直接断定满足3x+1  
    private static boolean isPower2(long i){  
        return 0 == (i & (i-1L));   
    }  
      
    // 满足3x+1猜想则返回true,否则死循环  
    public static boolean _3x1(long i){  
           while(!isPower2(i)){  
                // 如果是奇数  
                if(isOdd(i)){  
                    i += i>>1;
                    i++;
                // 如果是偶数  
                }else{    
                	i >>= 1;        
                }  
 
            }  
           return true;
  
    }  
      
    public static void main(String[] args) {  
        long start = System.currentTimeMillis();  
        for(long i=1; i<1000000L; i++){  
  
            if(_3x1(i)){  
                //System.out.println(i);  
            }  
  
        }  
        System.out.println(System.currentTimeMillis()-start);  
    }  
  
}  


还是要接近3秒,cpu1.8G
5 楼 抛出异常的爱 2010-08-06  
不加sysout
用时:1047
你可以试试你的机器上多少
public class _3X1 {  
          
    // 是否奇数  
    private static boolean isOdd(long i){  
        return (i&1L)==1L;  
    }  
       
    // 判断是否2的次方,如果是,直接断定满足3x+1  
    private static boolean isPower2(long i){  
        return 0 == (i & (i-1L));   
    }  
      
    // 满足3x+1猜想则返回true,否则死循环  
    public static boolean _3x1(long i){  
           while(!isPower2(i)){  
                // 如果是奇数  
                if(isOdd(i)){  
                    i += i>>1;
                    i++;
                // 如果是偶数  
                }else{    
                	i >>= 1;        
                }  
 
            }  
           return true;
  
    }  
      
    public static void main(String[] args) {  
        long start = System.currentTimeMillis();  
        for(long i=1; i<1000000L; i++){  
  
            if(_3x1(i)){  
                //System.out.println(i);  
            }  
  
        }  
        System.out.println(System.currentTimeMillis()-start);  
    }  
  
}  
4 楼 Crusader 2010-08-06  
public class _3X1 {
		
	// 是否奇数
	private static boolean isOdd(long i){
		return (i&1L)==1L;
	}
	
	// 判断是否4 | 2 | 1
	private static boolean is_4_2_1(long i){
		return i==4 || i==2 || i==1;
	}
	
	// 判断是否2的次方,如果是,直接断定满足3x+1
	private static boolean isPower2(long i){
		return 0 == (i & (i-1L)); 
	}
	
	// 满足3x+1猜想则返回true,否则死循环
	public static boolean _3x1(long i){
			int flag = 0;
			while(flag<3){
				// 如果是奇数
				if(isOdd(i)){
					i = i*3L+1L;				
				// 如果是偶数
				}else{
					if(isPower2(i))  
						return true;
					i >>= 1;		
				}
				
				if(is_4_2_1(i)){
					flag++;
				}else{
					flag=0;
				}
			}

		return true;
	}
	
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		for(long i=1; i<1000000L; i++){

			if(_3x1(i)){
				//System.out.println(i);
			}

		}
		System.out.println(System.currentTimeMillis()-start);
	}

}


2890,如果循环加上sysout要28000。。。
3 楼 抛出异常的爱 2010-08-05  
增加cache版
10^6 使用时间4547
效率十倍左右

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;



public class ThreeXone {
	Set cache = new HashSet< Long>();
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		ThreeXone x = new ThreeXone();
		x.cache.add(1L);
		long start = System.currentTimeMillis();
		for(int i = 0 ; i <100000 ;i++){
			x.mySelf(i);
		}
		long end = System.currentTimeMillis();
		System.out.println("使用时间"+(end - start) );

	}
	long trimZero(long bin){
		String str = Long.toBinaryString(bin);
		String result = StringUtils.substringBeforeLast(str, "1")+1;
		
		return Long.valueOf(result,2);
	}
	long funcOdd (long odd ){
		odd += odd>>1;
		odd ++;
		return odd;
	}
	void mySelf(long bin ){
		long result = 0;
		//System.out.print(bin+"->");
		long odd = trimZero(bin);
		if(isInMap(odd)){
			//System.out.println();
			return;
		}else{
			result = funcOdd(odd);
			mySelf(result);
			cache.add(bin);
		}
		
		
	}
	boolean isInMap(long odd) {
		
		return cache.contains(odd);
	}

}
2 楼 抛出异常的爱 2010-08-05  
大家如果想用int则录入值不能大于10^5
(会溢出)
1 楼 抛出异常的爱 2010-08-05  
10^5 速度2秒左右
10^6 速度39438

想法.
1,偶数除2等效于二进制去掉尾0
2.奇数乘3必为奇数 再+1必为偶数 等效为 2x + x +1  x左移1 + x +1
如果都除2等效为 x+ x右移1 +1


import org.apache.commons.lang.StringUtils;



public class ThreeXone {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		ThreeXone x = new ThreeXone();
		long start = System.currentTimeMillis();
		for(int i = 0 ; i <10^6 ;i++){
			x.mySelf(i);
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start );

	}
	long trimZero(long bin){
		String str = Long.toBinaryString(bin);
		String result = StringUtils.substringBeforeLast(str, "1")+1;
		
		return Long.valueOf(result,2);
	}
	long funcOdd (long odd ){
		odd += odd>>1;
		odd ++;
		return odd;
	}
	void mySelf(long bin ){
		long result = 0;
		//System.out.print(bin+"--");
		long odd = trimZero(bin);
		if(odd==1){
			//System.out.println();
			return;
		}else{
			result = funcOdd(odd);
			mySelf(result);
		}
		
		
	}

}

相关推荐

    3x+1问题的同高连续正整数 (1987年)

    本文证明了Collatz 3x+1问题的下列同高定理,给出无限多类型的长分别为3、4和15的同高连续正整数: (1)连续正整数C_t-1,C_t-2,C_t-3有相同的高,其中C_t=2~(46t+40)m+2~(64t+32); (2)连续正整数d_t-1,d_t-2,d_t-3和d_t-...

    应用二叉树论证3x+1猜想.pdf

    证明3x+1猜想仍是一个开放的数学问题,等待着数学家们的智慧去解决。 总的来说,这篇文章通过3x+1猜想的模6特性,结合二叉树的理论,提出了一个新的视角来研究这一长期未解的猜想。虽然尚未能给出决定性的证明,但...

    基于SpringBoot3.x+Vue3.x整合从0到1一步一步实现酒店管理系统

    分享一套关于酒店管理系统开发的教程——基于SpringBoot3.x+Vue3.x整合从0到1一步一步实现酒店管理系统,学完本课程,您将收获:增加项目实战经验;学习SpringBoot项目应用中遇到各种问题;学会使用前后端分离开发! ...

    On the Glide of the 3x+1 Problem

    ### 3x+1问题滑动特性研究 #### 摘要 本文研究了3x+1问题中的滑动特性,即从任意正整数n出发,在经历一系列操作后达到比n小的第一个数k(如果存在)的过程中,“乘以三加一”与“除以二”的次数之间的关系。通过...

    Some New Results On The 3x+1 Problem

    有关3x+1问题的一些新结果,蒋愉,吴栋梁,本文主要研究了公开的数学难题--3x+1问题。利用专业数学软件Mathematica 5.0,我们给出了一个较R.E.Crandall之前给出的更为完整和丰富的表格

    (x/1!)+(x*x*x/3!)+(5个x相乘/5!)+……+(2*n-1)个x相乘/(2*n-1)!)

    3. 使用递归调用`fun(x, n-1)`计算前n-1项的和,然后将当前项的值加到这个和上,返回结果。 在主函数`main`中,程序会提示用户输入x和n的值,然后调用`fun`函数并存储结果在变量`s`中,最后打印出`s`的值。 在程序...

    关于 x^2 = 1^2+2^2+3^2+...+n^2的证明

    数学证明之 x^2 = 1^2+2^2+3^2+...+n^2 在数学领域中,证明x^2 = 1^2+2^2+3^2+...+n^2是一项基本的任务...证明x^2 = 1^2+2^2+3^2+...+n^2的方法有多种,可以使用数学归纳法、Lucas' 平方金字塔问题或数学分析的方法。

    一元稀疏多项式的计算器.rar

    指数为1的项略去指数1,如3x。 (3)多项式a和b相加,建立多项式a+b。 (4)多项式a和b相减,建立多项式a-b。 【测试数据】 (1)(2x+5x8-3.1x11)+(7-5x8+11x9) = (-3.1x11+11x9+2x+7) (2)(6x-3-x+4.4x2-1.2x9)-(-...

    1+X模拟试题初级.zip

    3. **问题解决**:试题可能包含案例分析或问题解决部分,要求考生运用所学知识解决实际问题,以考察其分析和解决问题的能力。 4. **职业道德与法规**:初级试题也会涵盖行业内的职业道德标准和相关法律法规,以确保...

    1+X 初级 Java程序设计基础 1-9 章测试题汇总

    "1+X 初级 Java程序设计基础 1-9 章测试题汇总"是一个针对初级Java程序员的全面学习资源,旨在帮助学习者巩固和提升Java编程技能。这个资料集合了蓝桥官网的1到9章测试题,覆盖了Java语言的基础概念、语法和常用编程...

    TMS320C54X+DSP结构、原理及应用.rar

    1. 内核:TMS320C54X+ DSP的内核采用流水线设计,分为取指、解码、执行等多个阶段,能实现每周期多条指令的并行处理。 2. 寄存器:包括32个通用寄存器和多个专用寄存器,如累加器、程序计数器等,增强了数据处理...

    一元多项式运算数据结构课设.zip

    设有一元多项式Am(x)和Bn(x),Am(x)=A0+A1x1+A2x2+A3x3+… +Amxm,Bn(x)=B0+B1x1+B2x2+B3x3+… +Bnxn,请实现求M(x)= Am(x)+Bn(x)、M(x)= Am(x)-Bn(x)和M(x)= Am(x)×Bn(x)。 分别采用顺序和链式存储结构实现;结果...

    Notepad++ release 8.6.4 x64

    3. **插件系统**:Notepad++ 的一大亮点在于其丰富的插件库,如NppFTP用于FTP文件传输,Git插件进行版本控制,以及CodeFolding用于代码折叠,这些插件极大地扩展了编辑器的功能。 4. **用户界面定制**:用户可以...

    母牛问题

    x年出生的母牛从第x+m年开始到第x+n年止(含, 1 )每年生小母牛一头,并在第x+p(n )年被淘汰。设第0年有刚出生的小母牛一头,求第k(k &gt; 0)年存栏母牛多少头。 【输入形式】 从标准输入上顺序读入正整数m、n、p、k...

    新教材2020-2021学年北师大版高中数学第二册学案:第1章 6 第2课时 函数y=Asinωx+φ的性质 含解析.doc

    12. **具体问题分析**:例如,函数f(x)=sin(ωx)在区间[a,π/3]上有最小值但没有最大值,那么ω的可能值为8k-π/3,k∈Z,其中k=1时ω=8-π/3。 以上就是关于函数y=Asinωx+φ的特性讲解,这些知识在解决实际问题和...

    2018年秋八年级数学上册第12章整式的乘除专题训练一整式乘法中六种常见错误练习新版华东师大版

    在计算-x(x3+2x-1)+(2x-1)(3x+2)这类问题时,需确保每一项都被正确地乘以。 解决这些错误的关键在于熟练掌握幂的运算法则,正确理解同底数幂的加减乘除规则,注意负号和括号的影响,以及在展开和合并同类项时...

Global site tag (gtag.js) - Google Analytics