最少乘法次数
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次;
- 输入
- 第一行m表示有m(1<=m<=100)组测试数据;
每一组测试数据有一整数n(0<n<=10000); - 输出
- 输出每组测试数据所需次数s;
- 样例输入
-
3 2 3 4
- 样例输出
-
1 2 2
1 /* 2 Name: NYOJ--46--最少乘法次数 3 Copyright: ©2017 日天大帝 4 Author: 日天大帝 5 Date: 21/04/17 20:49 6 Description: 这道题说的都是以2为底的n次方;求至少需要多少次乘。 7 如果n为偶数,可由两部分相同的如2的4次方为2的平方相乘 8 如果n为奇数,则需要两部合成,第一步两部分形成偶数在乘以2得到偶数 9 这道题可以用递归的方法,反向递归,从n到1 10 或者直接循环 11 */ 12 #include<iostream> 13 using namespace std; 14 int main(){ 15 int t;cin>>t; 16 while(t--){ 17 int ct = 0,n;cin>>n; 18 while(n != 1){ 19 if(n & 1)ct += 2; 20 else ct++; 21 n /= 2; 22 } 23 cout<<ct<<endl; 24 } 25 return 0; 26 }
1 //递归代码 2 #include<iostream> 3 using namespace std; 4 int n,ct; 5 void dfs(int num){ 6 if(num == 1)return ; 7 ct++; 8 if(num & 1)dfs(num-1); 9 else dfs(num/2); 10 } 11 int main(){ 12 13 ios::sync_with_stdio(false); 14 15 int t;cin>>t; 16 while(t--) { 17 cin>>n; 18 ct = 0; 19 dfs(n); 20 cout<<ct<<endl; 21 } 22 return 0; 23 }