ALGO-227 蓝桥杯 算法训练 乘法次数

资源限制
时间限制:1.0s 内存限制:999.4MB
问题描述
  给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。24:22=2*2(第一次乘),22*22=24(第二次乘),所以最少共2次;
输入格式
  第一行m表示有m(1<=m<=100)组测试数据;
  每一组测试数据有一整数n(0<n<=100000000);
输出格式
  输出每组测试数据所需次数s;
样例输入
3
2
3
4
样例输出
1
2
2

算法分析

这道题的主要解决思路是通过二分法来计算。
由题目给的例子可以看到,当幂值为偶数时,我们将幂值除以2就可以找到一次“乘”,接着寻找除以2后的幂值通过几次“乘”得到,进行累计,循环求解。
那么当幂值为奇数时就需要就相当于要“乘”两次,再进行二分查找。
那么我们核心代码如下:

 public static int calculateTime(int n){
        int time=0;//计算次数
        while (n!=1){
            if(n%2==0)
                time+=1;//如果为偶数,乘法次数+1
            else
                time+=2;//如果为奇数,乘法次数+2
            n/=2;
        }
        return time;
    }

这样我们就把求解的过程写好了。代入到主函数中,完整的代码如下:

import java.util.Scanner;
public class 乘法次数 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        int[] num = new int[m];
        for (int i = 0; i < m; i++) {
            num[i]=scan.nextInt();
        }
		scan.close();
        for(int i=0;i<m;i++){
            System.out.println(calculateTime(num[i]));
        }
    }

    public static int calculateTime(int n){
        int time=0;//计算次数
        while (n!=1){
            if(n%2==0)
                time+=1;//如果为偶数,乘法次数+1
            else
                time+=2;//如果为奇数,乘法次数+2
            n/=2;
        }
        return time;
    }
}

(ps:实际上这道题根本不需要知道“给定一个非零整数”这个整数到底是哪个数,我们所有的考虑只与它的幂计算有关。开始没看明白这点想了半天这个整数到底是谁,哈哈哈哈哈,打扰了。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demonslzh6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值