当前位置: 首页 > news >正文

南桥-- 算法训练 2的次幂表示

题目详情

问题描写叙述
  不论什么一个正整数都能够用2进制表示。比如:137的2进制表示为10001001。
  将这样的2进制表示写成2的次幂的和的形式。令次幂高的排在前面,可得到例如以下表达式:137=2^7+2^3+2^0
   如今约定幂次用括号来表示,即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)
输入格式
  正整数(1<=n<=20000)
输出格式
  符合约定的n的0,2表示(在表示中不能有空格)
例子输入
137
例子输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
例子输入
1315
例子输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示
用递归实现会比較简单。能够一边递归一边输出

思路:1、先把输入的10进制数转换为2进制数

    2、对二进制数组按位处理,把原十进制数表示为对应的二进制表示(如:137=2^7+2^3+2^0),注意红色标记内容

    3、推断指数能否继续表示为二进制,就是题目提示的递归啦

注意事项:1、二进制数组从后向前输出才是原十进制的二进制形式。所以处理的时候要从最后一位開始。

    2、 ^ 转换成() 后,要添加对()的输出控制。2^1要直接输出2。而对于2^0和2^2分别输出2(0)和2(2)。

    3、对于加号的控制,最后一位处理后不需输出加号,从某一位開始后面全为0,该位处理后不需输出加号。

代码:

#include<stdio.h>

void solve(int n){
	//递归出口
	
	//当指数为0或2时,直接输出指数 
	if(n==0 || n==2){
		printf("%d",n);
		return ;
	}
	//当指数为1时(即2(1)不用输出) 
	if(n==1){
		return ;
	} 
	/*******以上为递归出口********/
	
	char str[20];
	int i=0,j,len,q;
	//转换为2进制。得到的字符串为原来的倒叙排列 
	 while(n){
	 	str[i]=n%2+'0';
	 	n/=2;
	 	i++;
	 }
	 len = i;
	 /*while() 用于标示倒数第几个不为0,用于控制+号的输出*/
	 q=0;
	 while(str[q]=='0'){
	 	q++;
	 } 
	 /*对2进制串按位处理*/
	 /*变量 j 用于标示当前处理是第几位,用于控制()的输出*/
	for(i--,j=1;i>=0;i--,j++){
		if(str[i]!='0'){
			/*若当前处理的字符后另一位(该位为2(1)。则省略括号)*/
			if((len-j)==1){
				printf("2");
			}else{
				printf("2(");
			}
			/*递归处理*/
			solve(len-j);
			/*若当前处理的字符后另一位(该位为2(1)。则省略括号)*/
			if((len-j)==1);
			else{
				printf(")");
			}
			/*当前处理最后一位,或当前位的后面全是0,不用输出+*/
			if((len-j)==0 || i==q);
			else{
				printf("+");
			}
		}
	}
}
int main(){
	int n;
	scanf("%d",&n);
	//1单独处理 
	if(n==1){
		printf("2(0)");
	}else{
		solve(n);
	}
		
	return 0;
}


相关文章:

  • 第九章:XML文档集成---AxInternalBase API
  • 微信登陆
  • 文本相似度计算--余弦定理和广义Jaccard系数
  • 结构型模型Bridge
  • PHP实现程序单例执行
  • Visual C#.Net网络程序开发-Tcp篇(3)
  • [New Portal]Windows Azure Virtual Machine (3) 在VM上挂载磁盘
  • ajax.net 我曾经轻视了他,郁闷。
  • 彻底去除Win10“快速访问”
  • 网络服务器时间发布地址
  • 《Python地理数据处理》——2.3 变量
  • 只能使用数组初始值设定项表达式为数组类型赋值。请尝试改用新的表达式
  • 《Total Commander:万能文件管理器》——12.3.高人高见
  • 在C#中应用哈希表(Hashtable)
  • 《Python数据可视化编程实战》——5.2 创建3D柱状图
  • 「译」Node.js Streams 基础
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • android 一些 utils
  • bearychat的java client
  • ECS应用管理最佳实践
  • Java 23种设计模式 之单例模式 7种实现方式
  • js学习笔记
  • laravel5.5 视图共享数据
  • SQLServer之创建显式事务
  • Vue.js-Day01
  • 阿里云购买磁盘后挂载
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 将回调地狱按在地上摩擦的Promise
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用docker-compose进行多节点部署
  • 用Python写一份独特的元宵节祝福
  • Linux权限管理(week1_day5)--技术流ken
  • zabbix3.2监控linux磁盘IO
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (6)STL算法之转换
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读40-45)图像描述1
  • (转)JAVA中的堆栈
  • (转)大型网站架构演变和知识体系
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .CSS-hover 的解释
  • .NET Framework杂记
  • .Net 垃圾回收机制原理(二)
  • .NET/C# 使用反射注册事件
  • .NET多线程执行函数
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)