首页 > 其他分享 >洛谷题单指南-递推与递归-P1010 [NOIP1998 普及组] 幂次方

洛谷题单指南-递推与递归-P1010 [NOIP1998 普及组] 幂次方

时间:2024-02-21 10:34:01浏览次数:30  
标签:递归 pow2 洛谷题 P1010 int 拆解 137 NOIP1998 次方

原题链接:https://www.luogu.com.cn/problem/P1010

题意解读:输出一个正整数的2 的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。

解题思路:

先看样例,给定整数137,要拆解成2的幂次方之和,

先考虑i使得刚好137>=2^i时,i取7,因此2^7是一个因子,137-2^7 = 137 - 128 = 9

再考虑i使得刚好9>=2^i时,i取3,因此2^3是一个因子,9 - 2^3 = 9 - 8 = 1

最后考虑i使得刚好1>=2^i时,i取0,因此2^0是一个因此,1 - 2^0 = 1 - 1 = 0

这样就完成了拆解137 = 2^7 + 2^3 + 2^0

因为整数最大是20000,因此每次在遍历找到第一个i是,可以从i=15开始递减,因为2^15 = 32768 > 20000 > 2^14 = 16384

要按格式输出结果,就需要递归处理

具体递归过程请参考代码注释。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;
int pow2[20]; //预计算2^i,pow2[i]表示2^i

//预计算pow2[20]
void init()
{
    int num = 1;
    pow2[0] = num;
    for(int i = 1; i <= 20; i++)
    {
        num *= 2;
        pow2[i] = num;
    }
}

//递归处理
void decode(int x)
{
    if(x == 0) //是0的时候就不需要拆解成2的次方了,直接输出
    {
        cout << "0";
        return;
    }

    for(int i = 15; i >=0; i--) //由于最大值是20000,要将x拆解多个2的次方之和,从2^15开始看是否够减,依次往后看
    {
        if(x >= pow2[i])
        {
            cout << "2";
            if(i != 1) //如果2^1,则直接输出2即可,不需要(1)
            {
                cout << "(";
                decode(i);
                cout << ")"; 
            }  

            x -= pow2[i];
            break; //只需要找第一个满足要求的i,剩下的交给递归处理
        } 
    }

    if(x > 0) //如果x减去2^i之后不为0,继续递归处理剩下的部分
    {
        cout << "+"; //+加上剩下的部分
        decode(x);
    }
}

int main()
{
    init(); //先预计算出2^i,存入pow2[20],便于后面使用
    cin >> n;
    decode(n);
    return 0;
}

 

标签:递归,pow2,洛谷题,P1010,int,拆解,137,NOIP1998,次方
From: https://www.cnblogs.com/jcwy/p/18024615

相关文章

  • 洛谷题单指南-递推与递归-P1259 黑白棋子的移动
    原题链接:https://www.luogu.com.cn/problem/P1259题意解读:要打印最终的状态,关键在找到一些变化的规律,直接的暴力搜索复杂度太高。解题思路:从样例出发ooooooo*******--oooooo--******o*oooooo******--o*ooooo--*****o*o*ooooo*****--o*o*oooo--****o*o*o*oooo****--o*o*o*ooo--......
  • 洛谷题单指南-递推与递归-P3612 [USACO17JAN] Secret Cow Code S
    原题链接:https://www.luogu.com.cn/problem/P3612题意解读:字符串加长的时候,是先把最后一个字符接上,再拼接其余字符,注意不是翻转,要找第n个字符,就要看字符串加长几次后长度能超过n,然后在加长后的字符串中找第n个字符。解题思路:如果直接通过模拟法,字符串长度太长,且要找的第n个数......
  • 洛谷题单指南-递推与递归-P1990 覆盖墙壁
    原题链接:https://www.luogu.com.cn/problem/P1990题意解读:用两种可旋转的形状铺满N*2的区域,求方案数,可以使用递推。解题思路:步骤1、设f[i]表示铺满i*2的区域的方案数根据要求,i*2区域最后一列有4种可能的铺法:如果采用图1铺法,则有f[i]=f[i-1]如果采用图2铺法,则有f[i]=f......
  • P1012 [NOIP1998 提高组] 拼数
    题目 源代码一、错误示范1//去比较最高位数字的大小,大的在前面(ASCII比较)2//使用字符串存储多个数字3#include<iostream>4#include<algorithm>5usingnamespacestd;6structstu7{8strings;9}student[25];10boolcmp(stua,stub)11{......
  • 洛谷题单指南-递推与递归-P1164 小A点菜
    原题链接:https://www.luogu.com.cn/problem/P1164题意解读:要求正好把钱花完,并且统计不同的点菜方案数,本质上是一个背包问题,给定背包体积,要求物品正好装满背包的方案数。解题思路:1、最直观的解法是暴搜:DFS枚举每一道菜,有点或者不点两种选择,并且累加上已花费的总金额递归前,判断......
  • 洛谷题单指南-递推与递归-P2437 蜜蜂路线
    原题链接:https://www.luogu.com.cn/problem/P2437题意解读:根据题目要求,只能从标号小的蜂房爬到标号大的相邻蜂房,即每次要么爬到+1的蜂房,要么爬到+2的蜂房,本质上是一个斐波那契数列问题,和数楼梯问题一样。解题思路:要求从m号蜂房到n号蜂房的路径,即走n-m级楼梯的方案,n最大1000,同样......
  • 洛谷题单指南-递推与递归-P1928 外星密码
    原题链接:https://www.luogu.com.cn/problem/P1928题意解读:要对形如xxx[Nxxx]xxx的字符串进行解码,[]内第一个数表示括号中字符串重复的次数,可以嵌套。解题思路:用递归进行处理,设函数decode(start,end)将下标从start到end之间字符串进行解码递归过程如下:遍历start~end的每一个字......
  • P1011 [NOIP1998 提高组] 车站
    题目描述火车从始发站(称为第11站)开出,在始发站上车的人数为aa,然后到达第22站,在第22站有人上、下车,但上、下车的人数相同,因此在第22站开出时(即在到达第33站之前)车上的人数保持为aa人。从第33站起(包括第33站)上、下车的人数有一定规律:上车的人数都是前两站上车人数......
  • P1012 [NOIP1998 提高组] 拼数
    [NOIP1998提高组]拼数题目描述设有\(n\)个正整数\(a_1\dotsa_n\),将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。输入格式第一行有一个整数,表示数字个数\(n\)。第二行有\(n\)个整数,表示给出的\(n\)个整数\(a_i\)。输出格式一个正整数,表示最大的整数样......
  • 洛谷题单指南-递推与递归-P1464 Function
    原题链接:https://www.luogu.com.cn/problem/P1464题意解读:虽然a、b、c可输入的范围比较大,但是递归中,只会限制在0-20以内,由于递归中有大量的重复计算,因此需要采用记忆化搜索来保存已经计算过的递归函数值。解题思路:定义三位数组LLmem[25][25][25],mem[a][b][c]保存w(a,b,c)的......