博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CCF NOI1074 2的幂次方表示
阅读量:7169 次
发布时间:2019-06-29

本文共 1561 字,大约阅读时间需要 5 分钟。

问题链接


时间限制: 1000 ms  空间限制: 262144 KB

题目描述 

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

进一步:7=22+2+20(21用2表示),3=2+20
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=210+28+25+2+1
  所以1315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入

  一个正整数n(n<=20000)。

输出

 
一行,符合约定的n的2的幂次方表示(在表示中不能有空格)。

样例输入

137

样例输出

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

数据范围限制

  n<=20000

提示

 


问题分析

  这个问题有关进制表示问题。

  其关键在于找到一个递归的函数进行处理。

程序说明

  函数convert(int n, int e)实现n的e次方转换为其2的幂次方表示。

要点详解

  • 递归函数是关键


参考链接:(略)。

100分通过的程序:

#include 
#define BASE 2void convert(int n, int e){ int digit, quotient; if(e == 0) { if(n == 0) ; else if( n == 1) printf("2(0)"); else if(n == 2) printf("2"); else { convert(n / BASE, e+1); digit = n % BASE; if(digit) { printf("+"); convert(digit, e); } } } else { quotient = n / BASE; digit = n % BASE; if(quotient > 0) { convert(quotient, e+1); if(digit) printf("+"); } if(digit) { if(e == 1) printf("2"); else { printf("2("); convert(e, 0); printf(")"); } } }}int main(void){ int n; scanf("%d", &n); convert(n, 0); printf("\n"); return 0;}/*123452(2(2+2(0))+2(2)+2(0))+2(2(2+2(0))+2(2))+2(2(2)+2(0))+2(2(2))+2(2+2(0))+2(0)*/

转载于:https://www.cnblogs.com/tigerisland/p/7563846.html

你可能感兴趣的文章
华为2018:年收入首破千亿美元大关,研发投入过千亿
查看>>
Mysql数据库备份和还原
查看>>
[译] 通过后台数据预获取技术实现性能提升
查看>>
ANGULAR JS常用指令NG-IF、NG-CLASS、NG-OPTION、NG-VALUE、NG-CLICK是如何使用的?
查看>>
cocos creator 视频交互游戏
查看>>
Android学习笔记15-从源码分析Activity的创建过程
查看>>
SpringMVC jsonView 注解笔记
查看>>
学习第二天笔记
查看>>
学习笔记
查看>>
Android做按住显密码的View
查看>>
静态路由原理及实验
查看>>
Android——自定义Dialog
查看>>
编码原理(附二)----二值化
查看>>
技能大赛规程
查看>>
涓栫晫鐢靛奖绠€鍙测€?
查看>>
Redis入门系列之队列和发布订阅模式
查看>>
Ceph学习笔记
查看>>
unity自带的水
查看>>
LVS搭建过程中需要用到的命令-- ipvsadm
查看>>
【No.9 内存泄漏了么】
查看>>