written by: 东篱下の悠然
首先看到这个题目描述,很简单~ 不用找规律 全模拟一下很快出结果。而且主题目除了前两句信息有用 后面都是“水话”不用看~ ps注意是要求输出 砍了多少次 噢,每次循环要计数器变量(我在这里定义了count)自增一次。代码如下~
#include <iostream> //标准输入输出流头文件,cin 和 cout 要在这里面调用
using namespace std; //声明一个命名空间
int main(){
int n, count = 0; //定义两个变量,一个存储输入的数据,一个做计数器
cin >> n; //从键盘读入一个数字并存入变量n
while( n != 1){ //当n没有被砍到1时,继续循环,继续砍
if( n % 2 == 0) //如果n能被2整除,就是偶数:
n /= 2; //是偶数就对半砍,并把结果刷新给变量n它自己
else //不是偶数就是奇数了呗
n = ( 3*n + 1) / 2; //是奇数就乘3加1,并且还要对半砍。这里可以不加小括号
count ++; //对n加工一次了,计数器自增一次
}
cout << count; //输出结果,就是计数
return 0;
}
ok, 上AC的图:
还有第二种解法~ 有一个灵活性极强的语句:goto语句,可以取代while循环,可以任意 随意 无条件地灵活转移语句,改变程序流向。但有缺点:它的灵活性实在太强啦,一不留神就陷入死循环,不太容易掌控。代码如下:
#include <iostream>
using namespace std;
int main(){
int n, count = 0;
cin >> n;
A:{ //设置标志,冒号结束
if( n == 1) { //进入循环首先判断n是不是=1。如果成立,就输出结果 并结束循环
cout << count;
return 0;
}
if( n % 2 == 0) n /= 2; //上同
else n = ( 3*n + 1) / 2;
count ++;
}
goto A;
}
AC图如下:
还有第三种解法…仔细读题,看到两个“砍掉一半”的字眼吗??是的,不论它是奇数还是偶数都逃不过被“砍掉一半”。把“砍掉一半”的操作提出来码在后面~ 只要 n != 1 满足,进入循环了,“砍掉一半”的操作只写一次就好咯^ _ ^因此这里是第一版的简洁版。代码如下:
#include <iostream>
using namespace std;
int main()
{
int num,count = 0;
cin >> num;
while( num != 1 )
{
if ( num%2 == 1) //奇数要先3*n+1再砍。偶数跳过这句if,直接砍
num = num*3 +1;
num /= 2;
count ++;
}
cout << count;
return 0;
}