牛客 简单的变换 签到题

链接: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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值