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

news2025/2/21 4:15:59

博主主页: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赋值为要转的数s
  fillchar(ejz,sizeof(ejz),0);
  fillchar(ans,sizeof(ans),0);
  while i>0 do
  begin
    inc(j);
    ejz[j]:=i mod 2;
    i:=i div 2;  //转2进制的过程在此。
  end;
  for i:=j downto 1 do
    if 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;
begin
  if 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 do
  begin
    if (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;
begin
  readln(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 = 0
    for i in str1[::-1]:
        if i == '1':
            list1.append(index)
        index += 1
    list1.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 str2


n=int(input())
print(f2(f1(n)))

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#基础:类class与结构struct的区别

一、类class 类class是引用类型&#xff0c;可以直接赋值为null&#xff0c;默认值也是null XClass xClass null;//语法正确 一般来说&#xff0c;某个类对象使用另一个类的对象赋值时&#xff0c;则两者共用一个内存地址【节约内存空间】&#xff0c;ReferenceEquals引用比…

JDK的安装-详细版

大家好&#xff0c;我是研究大数据领域的 查德-常&#xff0c;大数据是一个随着数据量快速增长而应运而生的行业&#xff0c;让我来带你了解大数据吧。 JDK的安装JDK安装1.1 搜索jdk1.2 登录Oracle1.3 安装jdk1.4 环境配置1.5 验证是否安装好jdk由于粉丝中初学者比较多&#xf…

《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: ​​【主页——&#x1f680;获取更多优质源码】​​ &#x1f393; web前端期…

西祠胡同社区彻底消失

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 今天打开西祠胡同&#xff0c;发现网站备案注销了&#xff0c;域名(www.xici.net)停止解析了&#xff0c;半年前1元转让股权的事也不了了之&#xff0c;西祠胡同就这样静悄悄的消失了&#xff0c;连…

MongoDB 数据库(一):MongoDB的介绍与安装

目录一、MongoDB数据库的介绍与安装1.1 NoSQL数据库简介1.2 MongoDB 简介1.2.1 再议业务应用场景1.2.2 为什么要使用 MongoDB1.2.3 适用场景二、安装和使用MongoDB客户端2.1 Windows 安装 MongoDB2.2 Linux-Centos7 安装 MongoDB2.3 安装Studio 3T一、MongoDB数据库的介绍与安装…

PyCharm连接远程Docker环境

1. docker 配置 使用-p参数暴露一个端口用于ssh连接。 docker run -itd --name wangchao_paddle --gpus all -p 8899:8888 -p 8822:22 -v /data:/root/data registry.baidubce.com/paddlepaddle/paddle:2.3.0-gpu-cuda10.2-cudnn7 /bin/bash如果镜像没有ssh则需要先安装。&am…

后台获取不到请求头中token信息的解决方法

前言 项目要做单点登录功能&#xff0c;于是在shiro的基础上加入了自定义的 Filter&#xff0c;使用 JWT 自定义生成和校验token信息。 功能写好后自己在 postman 中测试了效果&#xff0c;将 token 放在 Headers 中请求后台接口&#xff08;如下图&#xff0c;还没发现问题&…

【微服务】基于Ribbon实现负载均衡

前言 我们在上篇文章中讲解了如何通过Nacos实现服务治理&#xff0c;由此引发的负载均衡的问题。这篇文章就介绍一个SpringCloud alibaba的另一个组件&#xff1a;Ribbon&#xff0c;如何通过Ribbon实现负载均衡。 负载均衡 什么是负载均衡&#xff1f; 通俗的讲&#xff0…

C语言学习笔记

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言C的面向过程和C的面向对象1.C的数据类型与常量2.C中的变量1、什么是变量&#xff1f;2、变量名字的命名规则&#…

openlayer 加载4547坐标系 以及 wfs服务数据(或其他坐标系)

1.首先查看坐标系基础信息如范围等&#xff1a;如下图&#xff1a; 2.若将地图设置成4547坐标系&#xff1a; 核心代码&#xff1a; proj4.defs("EPSG:4547","projtmerc lat_00 lon_0114 k1 x_0500000 y_00 ellpsGRS80 unitsm no_defs typecrs");register…

ModelBox姿态匹配:抖抖手动动脚勤做深呼吸

摘要&#xff1a;本案例使用Windows版本的ModelBox SDK进行二次开发&#xff0c;主要是针对姿态匹配案例开发实践。本文分享自华为云社区《姿态匹配&#xff1a;抖抖手动动脚勤做深呼吸》&#xff0c;作者&#xff1a;吴小鱼。 在之前发布的AI说ModelBox推理真的高效吗一文中&…

对于含有琥珀酰亚胺酯的叠氮试剂Azidoacetic Acid NHS Ester,N3-C5-NHS ester,N3-C3-NHS ester 知识分享

本文重点为大家总结关于含有琥珀酰亚胺酯基团的叠氮基相关试剂的性质特点&#xff0c;西安凯新生物科技有限公司​主要从Azidoacetic Acid NHS Ester、N3-C5-NHS ester、N3-C3-NHS ester进行分享。 一、Azidoacetic Acid NHS Ester CAS&#xff1a;824426-32-6 中文名&#xff…

Linux shell脚本之回顾及实用笔记

一、前言 我们从事运维的小伙伴,除了自动化运维外,在没有自动化条件下,借助shell脚本/Python脚本来提升运维效率,无疑是一个必选项,当前也可以自建自动化运维平台,我们这里还是以Linux shell脚本为主,来汇总一些常用的运维脚本,对于有基础的同学,也随本文一起回顾下相…

【学习笔记】《模式识别》2:聚类分析

聚类分析 文章目录聚类分析一、聚类分析的概念二、相似性的测度1.距离的四条基本公理2.欧氏距离&#xff08;Euclid,欧几里得&#xff09;--距离3.马氏距离&#xff08;Maharanobis&#xff09;4.马氏距离与欧氏距离之间的关系5.明氏距离&#xff08;Minkowaki&#xff09;6.汉…

4款实用的黑科技软件,白嫖党最爱,功能强大到离谱

闲话少说&#xff0c;直上干货。 1、Dism 这是一款国人研发&#xff0c;免费又好用的电脑优化工具&#xff0c;备受全球电脑爱好者追捧&#xff0c;它解决了系统安装与维护两大痛点问题——自定义设置与优化&#xff0c;相当于给电脑请了免费“保姆”。从系统安装到调校&#x…

LabVIEW基础-VI Scripting

文章目录使用过程前面板界面修改属性节点VI属性无输入时默认当前VI。输入VI引用的静态方法输入VI引用的动态方法获取对象引用从VI获取前面板所有控件的引用设置修饰物的前景色获取选项卡1上所有的数值控件并设置标签前景色从VI获取前面板选项卡的引用-转换为特定的类-获取选项卡…

B+树的插入、删除和分裂,注意国内教材和国外的对于B+树的定义的不同

B树 1 国内教材上B树的定义 一棵 m 阶的B树满足 (考研教材)&#xff1a; 每个非叶子结点最多有 m 棵子树&#xff08;孩子结点&#xff09;根结点至少有2棵子树 (1层除外)&#xff0c;非叶结点至少有 m/2 (向上取整) 棵子树结点的子树的个数与关键字的个数相等: 介于 m/2 (向…

DSL查询文档

目录一、DSL查询语法二、DSL查询分类全文检索查询精确查询地理坐标查询复合查询复合查询——fuction score复合查询——Boolean Query三、搜索结果处理排序分页高亮一、DSL查询语法 DSL Query基本语法 查询成功 二、DSL查询分类 DSL Query的分类 Elasticsearch提供了基于…

【数据结构基础】之树的介绍,生动形象,通俗易懂,算法入门必看

前言 本文为 数据结构基础【树】 相关知识&#xff0c;下边将对树的定义与相关概念&#xff0c;二叉树的定义、特点与性质&#xff0c;二叉树的存储结构&#xff0c;二叉树的遍历&#xff0c;二叉查找树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;B-树与B树等进行详…

六十九、Vue3

Vue3一 Vue3的变化二 创建Vue3项目的两种方式2.1 vue-cl创建2.2 vite创建三 常用API3.1 setup3.2 ref和reactive3.3 计算和监听属性3.4 生命周期3.5 自定义hook函数一 Vue3的变化 性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% 源码的升级 使用Proxy…