链接:https://ac.nowcoder.com/acm/contest/6911/A
来源:牛客网
简单的变换
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给你一个正整数n,重复进行以下操作:
1.如果n是奇数,令n=n−3n=n-3n=n−3
2.如果n是偶数,令n=n/2n=n/2n=n/2
重复上述直至n=0停止,请输出进行操作的次数,如果n永远无法变成零,输出-1
示例1
输入
复制
2
输出
复制
-1
说明
1:2->1(2/2=1)
2:1->-2(1-3=-2)
3:-2->-1((-2)/2=(-1))
4.-1->-4(-1-3=-4)
5.-4->-2((-4)/2=(-2))
6.-2->-1((-2)/2=(-1))
…开始进入第三步操作到第五步操作的循环,n永远无法等于0,所以返回-1。
示例2
输入
复制
9
输出
复制
3
说明
1.9->6(9-3=6)
2.6->3(6/2=3)
3.3->0(3-3=0)
三步操作后n变为0,所以返回3。
备注:
对于30%30%30%的数据,1≤n≤1e61\leq n\leq 1e61≤n≤1e6
对于100%100%100%的数据,1≤n≤1e181\leq n\leq 1e181≤n≤1e18
请返回最少操作数或者-1
我们可以发现
- 对于一个奇数减去3后一定是偶数
- 所以对于任何一个数,不会出现一直
减3
的操作 - 硬模拟即可,复杂度接近
log(n)
class Solution {
public:
/**
*
* @param n long长整型
* @return int整型
*/
int Numberofoperations(long long n) {
// write code here
int cnt = 0;
while(n >= 3) {
if(n & 1) n = n - 3;
else n = n / 2;
cnt ++;
}
return n == 0 ? cnt : -1;
}
};