我是靠谱客的博主 任性发夹,最近开发中收集的这篇文章主要介绍PAT乙级(Basic)题库---1001,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目

1001-害死人不偿命的(3n+1)猜想

解题思路

这里的数不大,不用考虑溢出超时什么的,直接运用递归的思想,f(n)为数n砍到1时的步数,则
f(n)=f(n2+1,f(3n+12)+1,0, n  n 1 n 1 f ( n ) = { f ( n 2 ) + 1 , 如果  n  是偶数 f ( 3 n + 1 2 ) + 1 , 如果  n  是不为1的奇数 0 , 如果  n  为1

代码

虽然使用递归的思想,但是同样可以使用循环来实现,这里将两种方法均贴出。

递归

#include<iostream>
#include<math.h>
using namespace std;
//数num砍到1的步数
int step(int num)
{
//num为1 
if(num==1)
{
return 0;
}
//num是不为1的奇数
else if(num%2)
{
int temp=3*num+1;
return step(temp/2)+1;
}
//num是偶数
else
{
return step(num/2)+1;
}
}
int main()
{
int num;
while(cin>>num)
{
cout<<step(num)<<"n";
}
return 0;
}

循环

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
//sum记录数num砍到1的步数
int num,sum;
while(cin>>num)
{
sum=0;
//num为1时退出循环
while(num!=1)
{
//num是不为1的奇数
if(num%2)
{
num=(3*num+1)/2;
}
//num是偶数
else
{
num/=2;
}
sum++;
}
cout<<sum<<"n";
}
return 0;
}

最后

以上就是任性发夹为你收集整理的PAT乙级(Basic)题库---1001的全部内容,希望文章能够帮你解决PAT乙级(Basic)题库---1001所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部