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