zoukankan      html  css  js  c++  java
  • 蓝桥杯---角谷步数


    你听说过角谷猜想吗?
    任意的正整数,比如 5, 我们从它开始,如下规则计算:
    如果是偶数,则除以2,如果是奇数,则乘以3再加1.
    如此循环,最终必会得到“1” !

    比如 5 的处理过程是:
    5
    16
    8
    4
    2
    1

    一个正整数经过多少步才能变成1, 称为角谷步数。
    对于5而言,步数也是5
    对于1,步数为0

    本题的要求是,从标准输入给定一个整数n(1<n<300)表示角谷步数
    求满足这个角谷步数的最小的正整数

    例如:

    输入:
    3
    则输出:
    8

    输入:
    4
    则输出:
    16

    输入:
    7
    则输出:
    3


    开始的时候用递归,结果严重超时,剪枝也不怎么好用,索性最后就直接用差不多暴力的方式解决了,因为小于300数目不大

    注意要使用longlong数据类型,因为有几个数不然的话可能会出错,比如113383应该就超出范围了。。。

    另外:以后做蓝桥杯的题注意

    //蓝桥杯数目稍微大点就用long long  
    //蓝桥杯做题先用暴力,找出规律在做剪枝

    #include <iostream>
    #include <memory.h>
    using namespace std;
    int main (){
    	long long int count=0;
    	long long int mark[500],a[10005];
    	memset(mark,0,sizeof(mark));
    	memset(a,0,sizeof(a));
    	int n;
        cin>>n;
        for(int i=2;;i++){
    		long long int  temp=i,sum=0;
    		while(temp!=1){
    		 if(temp<=10000&&a[temp]!=0){
    		  	sum+=a[temp];
    			break;
    		  }
    		  if(temp%2==0)  temp/=2;
    		  else  temp=temp*3+1;
    		   sum++;
    		  count++;
    		}
    	if(i<=10000)
    		a[i]=sum;
    	if(mark[sum]==0){
        	mark[sum]=i;
    	}
    	if(mark[n]!=0)
    	   break; 
    }
    cout<<mark[n];	
    cout<<endl<<"判断是否超时,在循环中的耗时:"<<count;
    return 0;
    }
    


  • 相关阅读:
    11 Jun 18 复习,HTTP
    11 Jun 18 Django
    8 Jun 18 复习,mysql
    8 Jun 18 Bootstrap
    7 Jun 18 复习,文件,函数,sorted,colletions
    7 Jun 18 Bootstrap
    pip 使用方法
    http协议 1.1
    mysql 的视图 触发器 事务 存储过程 内置函数 流程控制 索引
    day 29 守护进程/互斥锁/IPC通信机制/生产者消费者模型
  • 原文地址:https://www.cnblogs.com/zswbky/p/5431976.html
Copyright © 2011-2022 走看看