2的次幂表示【递归算法训练】

简介: 【一个比较经典的算法题目】 题目链接: http://lx.lanqiao.org/problem.page?gpid=T235 http://noi.openjudge.cn/ch0202/8758/ 问题描述   任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
【一个比较经典的算法题目】
题目链接:
http://lx.lanqiao.org/problem.page?gpid=T235
http://noi.openjudge.cn/ch0202/8758/
问题描述
  任何一个正整数都可以用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)
提示
  用递归实现会比较简单,可以一边递归一边输出
分析:
本题可以参考一个算法:递归输出某十进制数的二进制表示的算法。(主要是在递归回溯的时候才输出,而非计算出来就输出。)
本着从易到难的原则,可以考虑先实现将137表示为:2(7)+2(3)+2(0)的程序。
关于加号的输出:可以考虑判断当前项是否二进制序列的最高位(传入下一层的数是0)。是最高位则当前项左侧不输出“+”,否则在当前项左侧输出“+”.
关于把指数也转变为0和2的序列:在输出每一项时判断指数是否超过1,超过则先输出“2(”,然后把该指数与0传入递归函数,递归显示该指数的表示。然后在输出后半边括号。
 
嗯可以先看看递归输出一个整数的二进制序列:
程序0:
#include <stdio.h>
void fun(int n)
{
int t;
if(n==0) return; else { t=n%2; fun(n/2); printf("%d",t); } } int main() { fun(5); return 0; }

 

程序一:实现将137表示为:2(7)+2(3)+2(0)的程序.
 1 #include <stdio.h>
 2 void toBinary(int n,int x);
 3 int main()
 4 {
 5     int n;
 6     freopen("out1.txt","w",stdout);
 7     n=1;
 8     while(n<=255)
 9     {
10         //scanf("%d",&n);
11         printf("%d---->",n);
12         toBinary(n,0);
13         printf("\n");
14         n++;
15     }
16     
17     return 0;
18 }
19 void toBinary(int n,int x)
20 {
21     int t;
22     if(n==0)
23         return;
24     else
25     {
26         t=n%2;
27         toBinary(n/2,x+1);
28         if(t)
29         {
30             if(x==1)
31             {
32                 if(n/2==0)
33                     printf("2");
34                 else printf("+2");
35             }
36             else
37             {
38                 if(n/2==0)
39                     printf("2(%d)",x);
40                 else printf("+2(%d)",x);
41             }
42         }
43     }
44 }

 

程序二:完整程序的实现。
 1 #include <stdio.h>
 2 void toBinary(int n,int x);
 3 int main()
 4 {
 5     int n;
 6     /*scanf("%d",&n);
 7     toBinary(n,0);*/
 8     
 9     freopen("out2.txt","w",stdout);
10     n=1;
11     while(n<=255)
12     {
13         //scanf("%d",&n);
14         printf("%d---->",n);
15         toBinary(n,0);
16         printf("\n");
17         n++;
18     }
19     
20     return 0;
21 }
22 void toBinary(int n,int x)
23 {
24     int t;
25     if(n==0)
26         return;
27     else
28     {
29         t=n%2;
30         toBinary(n/2,x+1);
31         if(t)
32         {
33             if(x==1)
34             {
35                 if(n/2==0)
36                     printf("2");
37                 else printf("+2");
38             }
39             else
40             {
41                 if(n/2==0)
42                 {
43                     //printf("2(%d)",x);
44                     if(x==0) printf("2(0)");
45                     else
46                     {
47                         printf("2(");
48                         toBinary(x,0);
49                         printf(")");
50                     }
51                 }
52                 else
53                 {
54                     //printf("+2(%d)",x);
55                     if(x==0) printf("+2(0)");
56                     else
57                     {
58                         printf("+2(");
59                         toBinary(x,0);
60                         printf(")");
61                     }
62                 }
63             }
64         }
65     }
66 }

 更新:上述代码的if逻辑可以简化。

 1 #include <stdio.h>
 2 void toBinary(int n,int x);
 3 int main()
 4 {
 5     int n;
 6     /*scanf("%d",&n);
 7     toBinary(n,0);*/
 8     
 9     freopen("out2.txt","w",stdout);
10     n=1;
11     while(n<=255)
12     {
13         //scanf("%d",&n);
14         printf("%d---->",n);
15         toBinary(n,0);
16         printf("\n");
17         n++;
18     }
19     
20     return 0;
21 }
22 void toBinary(int n,int x)
23 {
24     int t;
25     if(n==0)
26         return;
27     else
28     {
29         t=n%2;
30         toBinary(n/2,x+1);
31         if(t)
32         {
33             if(x==1)
34             {
35                 if(n/2==0)
36                     printf("2");
37                 else printf("+2");
38             }
39             else
40             {
41                 if(n/2!=0)printf("+");
42                 
43                 if(x==0) printf("2(0)");
44                 else
45                 {
46                     printf("2(");
47                     toBinary(x,0);
48                     printf(")");
49                 }
50             }
51         }
52     }
53 }

 

 

 

 
相关文章
|
7月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
60 1
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
57 1
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
114 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
2月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
2月前
|
算法 C++
蓝桥 算法训练 共线(C++)
蓝桥 算法训练 共线(C++)
|
5月前
knn增强数据训练
【7月更文挑战第27天】
43 10
|
5月前
|
数据采集 编解码 人工智能
破解ChatGPT惊人耗电!DeepMind新算法训练提效13倍,能耗暴降10倍
【7月更文挑战第19天】DeepMind的JEST算法革新AI训练,提升效率13倍,节能10倍。通过联合数据批次选择,预训练指导及多分辨率训练,优化资源利用,降低能耗。实验显示性能提升,达到SOTA水平,但实施需大量资源,依赖优质参考模型。[论文链接](https://arxiv.org/pdf/2406.17711)
76 10
|
5月前
knn增强数据训练
【7月更文挑战第28天】
49 2
下一篇
DataWorks