0 题面

题目描述

任何一个正整数都可以用2的幂次方表示。例如

  1. 137=2^7+2^3+2^0

同时约定方次用括号来表示,即a^b 可表示为a(b)。

由此可知,137可表示为:

  1. 2(7)+2(3)+2(0)

进一步:7= 2^2+2+2^0 (2^1用2表示)

  1. 3=2+2^0

所以最后137可表示为:

  1. 2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

  1. 1315=2^10 +2^8 +2^5 +2+1

所以1315最后可表示为:

  1. 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入输出格式

输入格式:

一个正整数n(n≤20000)。

输出格式:

符合约定的n的0,2表示(在表示中不能有空格)

输入输出样例

输入样例#1:

  1.  
输出样例#1:

  1. 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

1 思路

显然本题比较合适的方法是使用递归,而该递归函数主要操作是将数字拆分成为若干2的整次幂的和。

首先根据题意, "2(0)" 与 "2" 与 "2(2)" [分别代表1, 2, 4] 是可以被特判的,即直接输出相应格式,其它情况就进行拆分。

拆分的方法是利用二进制的移位,逐位与 1 进行 AND 操作即可,若使用 while 则记录位权,或直接使用 for 即可。

由于输出要使用 "+" 连接,引入一个标记变量来指示是否需要前置 "+" 即可。

2 代码

  1. #include <iostream>
  2.  
  3. void print(int n)
  4. {
  5. bool flag = false;
  6. for(int t = 30; t >= 0; t--)
  7. {
  8. if((n & (1 << t)))
  9. {
  10. if(flag == false)
  11. {
  12. flag = true;
  13. }
  14. else
  15. {
  16. std::cout << "+";
  17. }
  18. if(t == 0)
  19. {
  20. std::cout << "2(0)";
  21. }
  22. else if(t == 1)
  23. {
  24. std::cout << 2;
  25. }
  26. else if(t == 2)
  27. {
  28. std::cout << "2(2)";
  29. }
  30. else
  31. {
  32. std::cout << 2;
  33. std::cout << "(";
  34. print(t);
  35. std::cout << ")";
  36. }
  37. }
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43. int n;
  44. std::ios::sync_with_stdio(false);
  45. std::cin >> n;
  46. print(n);
  47. return 0;
  48. }

解题笔记-洛谷-P1010 幂次方的更多相关文章

  1. 洛谷P1010 幂次方

    题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137137可表示为: 2(7)+2(3)+2( ...

  2. 洛谷 P1010 幂次方 Label:模拟

    题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...

  3. 洛谷 P1010 幂次方

    做了好久,递归拆吧 #include<iostream>#include<cstdio>#include<cmath>using namespace std;int ...

  4. 集训作业 洛谷P1010 幂次方

    这个…… 这个题看上去有点难的样子. 仔细看看,感觉有点简单.啊,是递归啊,正经的看一看,好像是把一个数分成2的几次方的和. 然后余数和比他小的最大的2的次方数如果不是2的一次方或者2的0次方,就继续 ...

  5. Java实现 洛谷 P1010 幂次方

    输入输出样例 输入 #1 1315 输出 #1 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) import java.util.Scanner; pu ...

  6. 2021.07.26 P1010 幂次方(数论)

    2021.07.26 P1010 幂次方(数论) [P1010 NOIP1998 普及组] 幂次方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.二进制 题意: 用20 ...

  7. P1010 幂次方 P1022 计算器的改良

    P1010 幂次方 一.题目 https://www.luogu.org/problemnew/show/P1010 二.代码 #include<bits/stdc++.h> using ...

  8. P1010 幂次方 递归模拟

    题目描述 任何一个正整数都可以用22的幂次方表示.例如 137=2^7+2^3+2^0137=27+23+20 同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b). 由此可知,13713 ...

  9. p1010幂次方---(分治)

    题目描述 任何一个正整数都可以用222的幂次方表示.例如 137=27+23+20137=2^7+2^3+2^0 137=27+23+20 同时约定方次用括号来表示,即aba^bab 可表示为a(b) ...

随机推荐

  1. Java 第二周总结

    1.本周学习总结 (1)斐波那契函数 public static int fibonacci(int n)//斐波那契函数 { if(n<=2) { return 1; } else { ret ...

  2. 201521123016《JAVA程序设计》第1周学习总结

    本周学习总结 认识了Java包括JDK:Java开发工具包:JRE:Java执行环境:JVM:Java虚拟机 学习了一些JAVA基本语法,如:public class:public static vo ...

  3. AJAX二级下拉联动【XML方式】

    AJAX二级下拉联动案例 我们在购物的时候,常常需要我们来选择自己的收货地址,先选择省份,再选择城市- 有没有发现:当我们选择完省份的时候,出现的城市全部都是根据省份来给我们选择的.这是怎么做到的呢? ...

  4. Ant-打增量包

    如何打增量包具体用法见如下百度网盘的文档. http://pan.baidu.com/s/1gd5pAp1 1, ant 打源码增量包 build_incremental_src.xml 内容如下: ...

  5. webservice06#异常#Handler

    1, 异常处理 package com.yangw.soap.service; public class UserException extends Exception { public UserEx ...

  6. 保存数据到sdcard中去

    这里只贴上核心的代码:其它自行脑补!

  7. 常用Linux命令、包括vi 、svn

    /etc/init.d/network restart//===========================================更新脚本cd /www/scripts更新站点./sta ...

  8. wget下载整个网站

    wget下载整个网站wget下载整个网站可以使用下面的命令 wget -r -p -k -np http://hi.baidu.com/phps , -r 表示递归下载,会下载所有的链接,不过要注意的 ...

  9. vue2.0 网页标题更新实现思路

    一.注册全局指令 1.注册一个全局指令 Vue.directive('title', { inserted: function (el, binding) { document.title = el. ...

  10. MMORPG战斗系统随笔(二)、浅谈场寻路Flow Field PathFinding算法

    转载请标明出处http://www.cnblogs.com/zblade/ 今天给大家带来一篇游戏中寻路算法的博客.去年,我加入一款RTS的游戏项目,负责开发其中的战斗系统,战斗系统的相关知识,属于游 ...