从零单排PAT1001.害死人不偿命的(3n+1)猜想

这是一道很简单的题目,但是一开始就出错了。
//#include "stdafx.h"
#include <iostream> //基本输入流   
using namespace std;

int count = 0;   //全局变量赋值

void foo(int x)   //函数返回值表示用于实际的
{
	if(x == 1)
	{

	}
	else
	{
		if(x%2 == 0)   //如果是偶数
		{
			x = x / 2;  //除以2
			count ++ ;  //计数值+1
		}
		else
		{
			x = (3 * x + 1)/2;   //3n+1砍掉一半
			count ++ ;  //计数值+1
		}
		foo(x);    // 迭代
	}
}

int main()
{
	int number; //
	while(1)
	{
		cin >> number;
		if(number >= 0&& number <= 1000)   //边界条件设置,大于等于0小于等于1000
		{
			foo(number);
			cout << count <<endl;
			//return 1;
		}
		else
		{
			cout << "error!" << endl;
			//return 0;
		}
	}
	system("pause");
	
}


显示各种超时,显然我没必要用递归去做,我发神经病了吧,而且还用了全局变量,完全没有必要;第二次又是各种超时,再看,原来我并不需要循环,因为只要测试一次即可,也不要各种边界判断,所以可以直接上了。

int main()
{
	int number ;
	int count = 0;

	cin >> number ;
	while(number != 1)   //当符合这个条件时,退出
	{
		if(number % 2 == 0)  //偶数
		{
			number = number / 2;
			count ++;
		}
		else
		{
			number = (number * 3 + 1)/2;
			count ++;
		}
	}
	cout << count << endl; 

}


从这简单的题目可以看出,不需要考虑太多边界,输入条件,可循环,然后只是尽量保证运行速度和存储空间,以及算法的复杂度即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值