NYOJ--46--最少乘法次数

最少乘法次数

时间限制: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 }
原文地址:https://www.cnblogs.com/slothrbk/p/6746137.html