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