这是一道很简单的题目,但是一开始就出错了。
//#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;
}
从这简单的题目可以看出,不需要考虑太多边界,输入条件,可循环,然后只是尽量保证运行速度和存储空间,以及算法的复杂度即可。