信息学奥赛复赛复习05-CSP-J2020-01优秀的拆分-对数函数、自然对数、以2为底的对数、幂函数、打表

news2024/11/16 19:45:14

PDF文档回复:20240927

1 2020 CSP-J 题目1 优秀的拆分

[题目描述]

一般来说,一个正整数可以拆分成若干个正整数的和

例如,1=1,10=1+2+3+4 等。对于正整数 n的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,n被分解为了若干个不同的 2 的正整数次幂。注意,一个数 x 能被表示成 2 的正整数次幂,当且仅当 x 能通过正整数个 2 相乘在一起得到

例如,10=8+2=2^3 + 2^1 是一个优秀的拆分。但是,7=4+2+1=2^2 + 2^1 + 2^0 就不是一个优秀的拆分,因为 1 不是 2 的正整数次幂

现在,给定正整数 nn,你需要判断这个数的所有拆分中,是否存在优秀的拆分。若存在,请你给出具体的拆分方案

[输入格式]

输入只有一行,一个整数 n,代表需要判断的数

[输出格式]

如果这个数的所有拆分中,存在优秀的拆分。那么,你需要从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定了拆分数字的顺序后,该拆分方案是唯一的

若不存在优秀的拆分,输出 -1

[输入输出样例]

输入 #1

6

输出 #1

4 2

输入 #2

7

输出 #2

-1

说明/提示

样例 1 说明

6=4+2=2^2 + 2^1 是一个优秀的拆分。注意,6=2+2+2 不是一个优秀的拆分,因为拆分成的 3 个数不满足每个数互不相同

数据范围

对于 100% 的数据,1≤n≤10^7

2 相关知识点

1) 对数函数

C++提供了几个对数函数,可以用于计算不同底数的对数

自然对数

#include<bits/stdc++.h>
using namespace std;
/*
  自然对数 以e为底的对数 
  e的值约为2.718281828459045 
*/
int main(){
	double x= 3; 
	double natural_log = log(x);
	cout<<natural_log<<endl;
	x= 2.718281828459045;
	natural_log = log(x);
	cout<<natural_log<<endl;
	return 0;
}
/*
输出
1.09861
1 
*/ 

10为底对数

#include<bits/stdc++.h>
using namespace std;
/*
  10为底的对数
  log10(100)=2 
*/
int main(){
	double x= 100; 
	double _log10 = log10(x);
	cout<<_log10<<endl;
	x= 1000;
	_log10 = log10(x);
	cout<<_log10<<endl;
	return 0;
}
/*
输出
2
3
*/ 

2为底对数

#include<bits/stdc++.h>
using namespace std;
/*
  2为底的对数
  log2(16)=4 
*/
int main(){
	double x= 4; 
	double _log2 = log2(x);
	cout<<_log2<<endl;
	x= 32;
	_log2 = log2(x);
	cout<<_log2<<endl;
	return 0;
}
/*
输出
2
5
*/ 

2) 幂函数

cmath pow

#include<iostream>
#include<cmath>
using namespace std;
/*
  pow函数
  该函数接收两个参数,base 为要取次方的数,exponent 为指数。返回结果为 base 的 exponent 次方 
  double x =pow(base,exponent);
  pow=(2,3)=8 
*/ 
int main(){
	int base=2;
	int exponent=3;
	double x=pow(base,exponent);
	cout<<x<<endl;
	exponent=4;
	x=pow(base,exponent);
	cout<<x<<endl;
	return 0;
}
/*
输出
8
16 
*/ 

3) 打表

在编程中,是指将重要或计算成本较高的结果预先计算好并存放在内存(表)中,以供后续操作快速引用。这种技术经常在解决算法问题时使用,尤其是面对那些具有固定规律性、重复运算量大的场景

提前计算2的幂次方,把符合范围的2的幂次方都提前计算存储数组中,后续可以直接使用

#include<bits/stdc++.h>
using namespace std;
int n,a[30],m=1;
/*
  计算所有小于10^7的数的2的幂存储的数组a
*/
int main(){
	for(int i=0;i<=22;i++){
		m*=2;
		a[22-i]=m;
	}
	for(int i=0;i<=22;i++){
		cout<<a[i]<<" ";
	} 
	return 0;
}

输出a数组数据如下

3 思路分析

思路1

1 可以分解到最小2^1次幂的和,一定是偶数,所以奇数返回-1
2 通过log2(n)计算以2为底n的对数_log2,再通过2^(_log2)计算小于n的2的最大幂次数
3 每次去除并输出2的最大幂次数
4 剩余的n 重复步骤2
#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin>>n;
	if(n%2==1){//奇数返回-1
		cout<<-1;
		return 0;
	}
	while(n>1){
		int x=log2(n);//n的最大幂
		int base=pow(2,x);//n的最大幂次数 比如n=16 此时base为16 ,n=17此时base也为16 
		if(n>=base){//有2的幂次数
			n-=base;//去除本次输出的2的幂次数
			cout<<base<<" ";//输出此次2的幂次数
		}
	}
}

思路2

同思路1,计算2的幂次数使用打表法

提前计算所有小于等于n的最大幂次数,此时n的最大取整为10^7

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

int n,a[30],m=1;
int main(){
	for(int i=0;i<=22;i++){//打表提前计算所有小于10^7的幂次数,从大到小存储到a数组
		m*=2;
		a[22-i]=m;
	}
	cin>>n;
	if(n%2==1){//奇数返回-1
		cout<<"-1";
		return 0;
	}
	int idx=0;
	while(n>0 && idx<=23){//n都去除所有的2的幂次数
		if(n>=a[idx]){//包含此2的幂次数
			cout<<a[idx]<<" ";//输出此2的幂次数
			n=n-a[idx];//去除此2的幂次数
		}
		idx++;//找下一个2的幂次数
	}
	return 0;
}

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

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

相关文章

【Redis】安装redis-plus-plus

目录 安装redis-plus-plus 安装hiredis 安装redis-plus-plus本体 具体步骤 ​编辑编写一个hello程序 安装redis-plus-plus C操作redis的第三方库有很多&#xff0c;咱们此处使用redis-plus-plus&#xff0c;安装链接如下&#xff1a; GitHub - sewenew/redis-plus-plus: …

gitee windows/linux配置使用

1、安装git工具 地址&#xff1a;git工具安装地址 1.2在gitee上创建仓库 在浏览器中打开Gitee网站&#xff0c;并登录到您的账户。点击页面右上方的加号图标&#xff0c;然后选择“新建仓库”。输入仓库的名称、描述和其他相关信息&#xff0c;然后点击“创建仓库”按钮。添…

大势Inside | “郧县人”重大考古成果写入人教版初中历史教科书

近日&#xff0c;发掘于湖北十堰郧阳的“郧县人”考古成果被写入2024年秋人教版历史教科书&#xff08;七年级上册&#xff09;第一课“远古时期的人类活动”&#xff0c;与闻名中外的“元谋人”、“蓝田人”、“北京人”、“山顶洞人”并列。 人教版七年级上册中国历史教科书 …

基于SSM的图书管理管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的图书管理管理系统4拥有两种角色&#xff0c;用户可以浏览评论图书、登录注册&#xff0c;管理员可以进行图书馆管理、用户管理、分类管理等功能 1.1 背景描述 图书书店销售管理…

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Meta的LLaMA 3.2系列大模型打败OpenAI,Orion的原型AR眼镜更是引领科技新时代!

Meta公司推出的LLaMA 3.2系列模型在人工智能领域引起了广泛关注。这些模型包括了多种尺寸&#xff0c;从适合移动应用和边缘设备的轻量级模型&#xff08;1B和3B参数版本&#xff09;到功能强大的90B视觉模型&#xff0c;后者支持文本和图像处理任务&#xff0c;如图像字幕、文…

腾讯邮箱上传附件卡、慢、无法上传,下载慢问题处理

1、检查文件中转站容量是否已满 2、建议用户打开链接https://exmail.qq.com/qy_mng_logic/wasmHelper?typehashv2&#xff0c;看是否可以正常访问。&#xff08;能打开下载就表示可以正常访问&#xff09; 3、让用户切换到4G或者其他网络再重新上传附件是否会重现问题&#xf…

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…

python -tkinter

在Button的command绑定中&#xff0c;如果给的一个函数&#xff0c;则表示执行一次。 import tkinter as Tkfrom tkinter import messageboxi 0def myLabel():global root,is Tk.Label(root,text"the import thing is :" )s.pack()root Tk.Tk()def fun1():if mess…

一文系统了解软件检测实验室CNAS认可,文件依据、资源准备、流程、预算

软件检测实验室获取CNAS认可不但可以提升实验室的权威度和社会认可度&#xff0c;在部分区域还可以拿到相关补贴资金。 一、软件检测实验室CNAS认可依据 CNAS-R01&#xff1a;2023《认可标识使用和认可状态声明规则》 CNAS-R02&#xff1a;2023《公正性和保密规则》 CNAS-R…

C语言线程

线程 多个进程中通过轮流使用CPU来完成自己的任务&#xff0c;如果多个进程的操作都一模一样那么CPU的开销就会很大&#xff0c;因为进程的地址都是私有的&#xff0c;如果CPU对相同的操作只执行一次&#xff0c;后面再遇到直接去获取即可&#xff0c;这样大大降低了CPU的开销…

WIN系统 -> CMD命令

查看哪个PID&#xff08;进程ID)--8001 netstat -ano | findstr :8001&#xff0c;然后查看哪个PID&#xff08;进程ID&#xff09;正在使用8001端口 手动结束进程

容器编排工具Docker Compose

目录 一、Docker Compose概述 1、主要功能 2、工作原理 二、常用命令参数 1、服务管理 2、构建和重新构建服务 三、Docker Compose的yml文件 1、服务 2、网络 3、存储卷 四、容器编排实现haproxy和nginx负载均衡 一、Docker Compose概述 1、主要功能 定义服务&#xf…

Linux系统进程控制

目录 一、进程创建 1.进程创建过程 2.写时拷贝 3.fork函数的两种常规用法 二、进程终止 1.进程终止的三种情况 2.进程退出信息 &#xff08;1&#xff09;退出码 &#xff08;2&#xff09;退出信号 3.进程终止的方式 三、进程等待 1.为什么要有进程等待&#xff1f…

成都睿明智科技有限公司赋能商家高效变现

在这个日新月异的数字时代&#xff0c;抖音电商正以不可阻挡之势崛起&#xff0c;成为众多品牌与商家竞相角逐的新战场。在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司如同一颗璀璨新星&#xff0c;凭借其专业的服务、创新的策略和敏锐的市场洞察&#xff0…

C++你不得不知道的(1)

C你不得不知道的&#xff08;1&#xff09; 【1】引例&#xff1a; 1、C语言在使用的过程中存在冲突问题&#xff01; 解决办法&#xff1a;使用域将想要使用的变量包括进去。 #include<stdio.h> int rand10; int main() {printf("%d\n",rand);return 0; }此…

VS Code激活python虚拟环境常见报错

VS Code激活python虚拟环境常见报错 问题1&#xff1a;执行激活 activate 报错 问题1&#xff1a;执行激活 activate 报错 解决&#xff1a; Win X *执行 set-executionpolicy remotesigned 再输入 Y

【智慧城市】新中地GIS开发实训项目:华农优秀学生学习成果展示(3)智游江城

华农GIS开发实训项目答辩③-智游江城/一个月学习成果展示 项目名称&#xff1a;智游江城 项目功能 主页面展示 菜单功能 控制台 3D城市 查询 导航 游览路线推荐 测量 资讯

Colorful/七彩虹将星X15 AT 23 英特尔13代处理器 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

DataWhale x南瓜书学习笔记 task04笔记

线性判别分析&#xff08;LDA&#xff09; 前提假设&#xff1a;各类样本的协方差矩阵相同且满秩LDA的思想&#xff1a;1.设法让训练样例集投影到一条直线上&#xff0c;2.同类样例的投影点尽可能接近&#xff0c;异类样例的投影点尽可能远离&#xff0c;3.在对新样本进行分类时…