博主主页:Yu·仙笙

专栏地址:洛谷千题详解

目录

题目描述

输入格式

输出格式

输入输出样例

解析:

C++源码:

Pascal源码:

Java源码:

Python源码:


-------------------------------------------------------------------------------------------------------------------------------

 -------------------------------------------------------------------------------------------------------------------------------

题目描述

任何一个正整数都可以用 2 的幂次方表示。例如 137=27+23+20。

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

由此可知,137可表示为 2(7)+2(3)+2(0)

进一步:

7= 2^2+2+2^0 ( 2^1 用 2 表示),并且 3=2+2^0

所以最后 137可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)。

又如 1315=2^10+2^8 +2^5 +2+1

所以 1315 最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。

-------------------------------------------------------------------------------------------------------------------------------

输入格式

一行一个正整数 n。

-------------------------------------------------------------------------------------------------------------------------------

输出格式

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

-------------------------------------------------------------------------------------------------------------------------------

输入输出样例

输入#1

1315

输出 #1

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

-------------------------------------------------------------------------------------------------------------------------------

解析:

我们知道,二进制数表示的其实就是一个正整数分解成为2的幂次方和!

如3用二进制表示为 11 ,从右到左分别是第0位,第1位……

则3=2^1+2^0(只要二进制那位是一,就是2^(这一位))

再比如10 二进制是1010,则10=2^3+2^1;

大家自己体会一下

下面更高级的:位运算(其实也不高级,就是没人做)

不会位运算的就用上面那种吧,个人觉得位运算更快(普通14ms,位运算11ms)

位运算具体问度娘吧

思路如下:

遍历n的二进制(从地位到高位),用数组储存该位为1的位数;如1010(即10),先记录第1位是1,最后记录到第3位是1;

遍历完成后,对高位先进行处理(即原来为i++,现在变为i--)

该位(就是幂的次数)大于2,,递归再次处理

一旦处理到该位小于3,输出;

-------------------------------------------------------------------------------------------------------------------------------

C++源码:

#include<cstdio>
using namespace std;
void ASCII(int m)
{int i=0,k=m,u=0,h[50];while(k)//位运算实现;{if(k&1)h[++u]=i;//h[++u]相当于++u,h[u]…… k>>=1;i++;}//据上面写的,u从1开始,无论如何一定会有输出; while(u)//u为真 {if(h[u]<3)//具体括号判断;{if(h[u]==1 && u-1!=0)  printf("2+");else if(h[u]==1)     printf("2");if((h[u]==0||h[u]==2)&&(u-1!=0))  printf("2(%d)+",h[u]);else if(h[u]==0||h[u]==2)        printf("2(%d)",h[u]);   --u;//搜索下一个;}else{printf("2(");ASCII(h[u--]);//相当于h[u],--u; //这里千万不能写成 h[--u],否则你会3个WA两个MLE; if(u!=0)printf(")+");//由于u进行了自减,此时的u已经是下一个数了; else printf(")");//判断括号;} }
}
int main()
{int n;scanf("%d",&n);ASCII(n);return 0;//别忘了写;
}

-------------------------------------------------------------------------------------------------------------------------------

Pascal源码:

type num=array[0..100000] of longint;
var i,j,k,l,n,m,o,p,h:longint;
//这里的a[0]指数组长度。
function ejz(s:longint):num;//要转的数
var i,j,k:longint;ans:num;
begin  i:=s; j:=0; k:=0; //让变量i赋值为要转的数sfillchar(ejz,sizeof(ejz),0);fillchar(ans,sizeof(ans),0);while i>0 dobegininc(j);ejz[j]:=i mod 2;i:=i div 2;  //转2进制的过程在此。end;for i:=j downto 1 doif ejz[i]=1 then begin inc(k); ans[k]:=i-1; end;//若2进制的第n位为1,那么数组中必有n-1。这个应该知道吧ans[0]:=k;exit(ans);
end;
procedure search(a:longint);
var n:num; i:longint;
beginif a=0 then begin write('2(0)'); exit; end; //如果要处理0,那么...if a=1 then begin write('2'); exit; end;    //如果要处理1,那么...n:=ejz(a);for i:=1 to n[0]-1 dobeginif (n[i]<>1) and (n[i]<>0) then write('2(');//这里要注意了!2^1不是2(1)!!!search(n[i]);//递归处理数组里的数if (n[i]<>1) and (n[i]<>0) then write(')');write('+');//不要把加号输多了!end;if (n[n[0]]<>1) and (n[n[0]]<>0) then write('2(');search(n[n[0]]);if (n[n[0]]<>1) and (n[n[0]]<>0) then write(')');
end;
beginreadln(n);search(n);
end.

-------------------------------------------------------------------------------------------------------------------------------

Java源码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc= new Scanner(System.in);int a=sc.nextInt();pow(a);}public static void pow(int a){if(a>3){int s=0;int b=2;while(b<=a){b=b*2;s++;}a=a-b/2;System.out.print("2(");pow(s);if(s==3){System.out.print("2+2(0)");}if(s==1){System.out.print("2(0)");}if(s==2){System.out.print("2");}System.out.print(")");if(a==3){System.out.print("+2+2(0)");}if(a==1){System.out.print("+2(0)");}if(a==2){System.out.print("+2");}if(a>3){System.out.print("+");}pow(a);}}
}

-------------------------------------------------------------------------------------------------------------------------------

Python源码:

def f1(x):##获取一个数的幂str0 = bin(int(str(x), 10))str1 = str0[2:]list1 = []index = 0for i in str1[::-1]:if i == '1':list1.append(index)index += 1list1.reverse()return list1
def f2(list):##格式化输出list1 = [str(i) for i in list]str2 = ''for i in range(len(list1)):if i < len(list1) - 1:if list1[i] == "1":str2 += "2+"else:if list[i] != 0:str2 += "2({})+".format(f2(f1(list[i])))else:str2 += "2(0)"if i == len(list1) - 1:if list1[i] == "1":str2 += "2"else:if list[i] != 0:str2 += "2({})".format(f2(f1(list[i])))else:str2 += "2(0)"return str2n=int(input())
print(f2(f1(n)))

-------------------------------------------------------------------------------------------------------------------------------

洛谷千题详解 | P1010 [NOIP1998 普及组] 幂次方【C++、Java、Python、Pascal语言】相关推荐

  1. 洛谷千题详解 | P1008 [NOIP1998 普及组] 三连击【C++、Java、Python语言】

    博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: Java源码: Python源码: ----------------------- ...

  2. 洛谷千题详解 | P1014 [NOIP1999 普及组] Cantor 表【C++、Java语言】

    博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: C++源码2: C++源码3: Java源码: ----------------- ...

  3. 信息学奥赛一本通 1208:2的幂次方表示 | OpenJudge 2.2 8758:2的幂次方表示 | 洛谷 P1010 [NOIP1998 普及组] 幂次方

    [题目链接] ybt 1208:2的幂次方表示 OpenJudge 2.2 8758:2的幂次方表示 洛谷 P1010 [NOIP1998 普及组] 幂次方 [题目考点] 1. 递归 [解题思路] 递 ...

  4. 洛谷P1010 [NOIP1998 普及组] 幂次方

    文章目录 前言 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 [数据范围] 代码 解析 结尾 前言 在做完洛谷P1010 [NOIP1998 普及组] 幂次方这道题之后,我 ...

  5. 洛谷——P1010 [NOIP1998 普及组] 幂次方

    P1010 [NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 22 的幂次方表示.例如 137=27+23+2^0137=27+23+20. 同时约定方次用括号来表示,即 a^b ...

  6. P1010 [NOIP1998 普及组] 幂次方 题解

    P1010 [NOIP1998 普及组] 幂次方 题解 题目描述 任何一个正整数都可以用 2 的幂次方表示.例如 137 = 2 7 + 2 3 + 2 0 . 137=2^7+2^3+2^0. 13 ...

  7. 洛谷P1010 [NOIP1998 普及组] 幂次方 C语言/C++

    [NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示.例如 $137=27+23+2^0 $. 同时约定方次用括号来表示,即 a b a^b ab 可表示为 ...

  8. P1010 [NOIP1998 普及组] 幂次方 递归模拟

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

  9. 洛谷P1010 [NOIP1998 普及组] 幂次方题解

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

最新文章

  1. centos安装软件_CentOS 8 和 Ubuntu 18.04 部分软件版本比较
  2. 内核调试相关变量说明
  3. Struts2中Action之ResultType
  4. 对Java Inputstream的一次采访
  5. data layui table 排序_浅谈layui中table的sort排序
  6. vim 文本一些行注释,替换
  7. string concat_Java String concat()方法与示例
  8. Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02)
  9. Android开发笔记(八十七)几个修饰关键字
  10. 我的世界1.14java原版命令_我的世界:老一辈mc是怎么生存的?鱼骨式挖矿,这些套路你知道吗...
  11. getOutputStream() has already been called for this response异常的原因和解决方法[转]
  12. easyUI datebox 日期空间斜杠格式化。例如将日期空间中显示2017-03-13,改为2017/03/13...
  13. 简单的视频制作及在会声会影中出现的问题及其解决方法
  14. 机械制图与计算机绘图习题集第二版答案,机械制图与计算机绘图习题集(第2版)-曾令宜.pdf...
  15. 关于微信开发者平台移动应用(android)获取签名问题
  16. 高带宽数字内容保护( HDCP )介绍
  17. redirectType=Found和redirectType=Permanent哪个是301哪个是302?
  18. 免外围电路ESP32/ESP8266系列单片机串口一键下载方案
  19. VCS+Verdi脚本化仿真Vivado工程流程
  20. 常用调试方法——Debug技巧总结

热门文章

  1. 零基础学前端开发培训
  2. 七月学习之E6、ES7、ES8、ES9、ES10、ES11新特性
  3. 是用bbed工具模拟对块的破坏,并使用rman bock recover进行块恢复
  4. 基于javaweb的精美物流管理系统(java+springboot+vue+mysql)
  5. Linux开放1521端口允许网络连接Oracle Listene
  6. net.sf.cglib.beans.BeanCopier用途
  7. 数据分析 — 用户粘性的两个计算指标(DAU/MAU和月人均活跃天数)
  8. SpringBoot2.2.2+Elasticsearch7.6.2实现中文、拼音、拼音首字母智能提示功能
  9. 中科院大学计算机科学与技术王伟强,李振宇 - 中国科学院大学 - 计算机科学与技术学院...
  10. CDQ分治——学习笔记