• 蓝桥杯 乘法次数 模拟


    问题描述
      给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次;
    输入格式
      第一行m表示有m(1<=m<=100)组测试数据;
      每一组测试数据有一整数n(0<n<=100000000);
    输出格式
      输出每组测试数据所需次数s;
    样例输入
    3
    2
    3
    4
    样例输出
    1
    2
    2
    看半天也没看明白"给你一个非零整数,让你求这个数的n次方",中的"这个数"是谁,不过好像没影响,暂定输入的数是"这个数",也是要求的次方数。
    分析样例:
    输入2时,求2^2从2由几步能得出:2  *  2  =  2^2,一步得出
    输入3时,求3^3从3由几步能得出:3  *  3  =  3^2,3^2  *  3  =  3^3,两步得出
    输入4时,求4^4从4由几步能得出:4  *  4  =  4^2,4^2  *  4^2  = 4^4,两步得出
    先看代码再解释
     1 #include <bits/stdc++.h>
     2 using namespace std; 
     3 int main() {
     4     int t; 
     5     cin >> t;
     6     while (t--) {
     7         int n;
     8         cin >> n;
     9         int ans = 0;
    10         while (n != 1) {
    11             if(n % 2 != 0) { //奇数,乘两次 
    12                 ans += 2; 
    13             } else { //偶数,乘一次 
    14                 ans++; 
    15             }      
    16             n /= 2;  
    17         }
    18         cout << ans << endl;    
    19     }    
    20     return 0;
    21 }

    解释:从大向小递归分析,

    当n=8时,要求8次方能由几步乘法得出,8是偶数,n / 2 = 4,8次方可以由4次方乘4次方得出,需要一步

    然后分析4次方能由几步乘法得出,相当于上一步中的n现在变为n=4了,n / 2 = 2,4次方可以由2次方乘2次方得出,又需要一步
    然后分析2次方能由几步乘法得出,相当于上一步中的n现在变为n=2了,n / 2 = 1,2次方可以由1次方乘1次方得出,又需要一步
    要求8^8,一共需要3步,8  *  8  =  8^2,8^2  * 8^2  =  8^4,  8^4  *  8^4  =  8^8。

    当n=7时,要求7次方能由几步乘法得出,7是奇数,n / 2 = 3(c++里除法向下取整),7次方可以由3次方乘4次方得出,就是说,我们先得出3次方,然后3次方乘以1次方,得出4次方。再拿3次方乘以4次方得出7次方,需要两步

    然后分析3次方能由几步乘法得出(因为上一步中的4次方是由3次方乘以1次方得出的,这里只需要考虑得出3次方需要几步),相当于上一步中的n现在变为n=3了,n / 2 = 1,3次方可以由1次方乘2次方得出,2次方是由1次方乘以1次方得出,又需要两步
    所以要求7^7,一共需要4步,7  *  7  =  7^2,7  * 7^2  =  7^3,  7 ^ 3 *  7  =  7^4,7^3  * 7^4  =  7^7.
     
     
  • 相关阅读:
    我的Java学习路线图
    请求重定向和请求转发的区别
    PHP代码审计学习-php安全基础
    无密码正向直连内网linux目标机复现
    Windows API 学习
    Http请求走私
    免杀手法-tcp套字节传递shellcode学习
    自启动模块构造-计划任务
    自启动模块构造-快速启动目录
    进程注入免杀学习
  • 原文地址:https://www.cnblogs.com/fx1998/p/12604007.html
Copyright © 2020-2023  润新知