Sweety

Practice makes perfect

导航

蓝桥杯---角谷步数

Posted on 2015-04-05 19:26  蓝空  阅读(289)  评论(0编辑  收藏  举报

你听说过角谷猜想吗?
任意的正整数,比如 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;
}