每日一九度之 题目1031:xxx定律
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:6870
解决:4302
对于一个数n,如果是偶数,就把n砍掉一半;如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止。
请计算需要经过几步才能将n变到1,具体可见样例。
</dd> </dl> <dl> <dt> 输入: </dt> <dd> 请计算需要经过几步才能将n变到1,具体可见样例。
测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束。(1<=n<=10000)
</dd> </dl> <dl> <dt> 输出: </dt> <dd> 对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行。
</dd> </dl> <dl> <dt> 样例输入: </dt> <dd> 3 1 0</dd> </dl> <dl> <dt> 样例输出: </dt> <dd>
5 0</dd> </dl>
挺简单的一道模拟题,但是也可以用数学方法计算出n与次数的关系式(可以自己尝试下)。
//Asimple #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cctype> #include <cstdlib> #include <stack> #include <cmath> #include <map> #include <string> #include <queue> #define INF 100000 using namespace std; const int maxn = 1005; typedef long long ll; int n; int fun(int n, int cnt){ if( n == 1 ) return cnt; else if( n & 1 ){ n = 3 * n + 1 ; n /= 2 ; fun(n,cnt+1); } else { n /= 2 ; fun(n,cnt+1); } } int main(){ while( scanf("%d",&n) && n ){ int cnt = 0; cout << fun(n,cnt) << endl ; } return 0; }