zoukankan      html  css  js  c++  java
  • nyoj 46-最少乘法次数 (递推)

    46-最少乘法次数

      内存限制:64MB 时间限制:1000ms Special Judge: No
      accepted:5 submit:18


    题目描述:

    给你一个非零整数,让你求这个数的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 * 2^(n-1) * 2^(n-1),即就是一半与一半相乘的结果再乘以2(奇数)
      2、那么得到的结果就是最少的相乘次数

    核心代码:
      
     1 while(n != 1)
     2 {
     3     if(n&1)
     4     {
     5         cnt += 2;
     6         n = (n-1) / 2;
     7     }
     8     else 
     9     {
    10         cnt ++;
    11         n = n / 2;
    12     }
    13 }
    
    

    C/C++代码实现(AC)

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <stack>
     7 #include <map>
     8 #include <queue>
     9 #include <set>
    10 
    11 using namespace std;
    12 
    13 int main()
    14 {
    15     int t;
    16     scanf("%d", &t);
    17     while(t --)
    18     {
    19         int n, cnt = 0;
    20         scanf("%d", &n);
    21         while(n != 1)
    22         {
    23             if(n&1)
    24             {
    25                 cnt += 2;
    26                 n = (n-1) / 2;
    27             }
    28             else
    29             {
    30                 cnt ++;
    31                 n /= 2;
    32             }
    33         }
    34         printf("%d
    ", cnt);
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    nginx location 语法
    nginx 日志文件
    nginx 配置文件详解
    mysql分区partition
    MySQL跳过密码登录
    min/max优化,count ,group by
    in型子查询陷阱,exists子查询
    explain分析sql效果
    HDU2896 病毒侵袭 —— AC自动机
    二分图之 多重匹配 和 最大权匹配 等总结
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9099761.html
Copyright © 2011-2022 走看看