资源限制
时间限制: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:实际上这道题根本不需要知道“给定一个非零整数”这个整数到底是哪个数,我们所有的考虑只与它的幂计算有关。开始没看明白这点想了半天这个整数到底是谁,哈哈哈哈哈,打扰了。)