• 经典递归


    蓝桥网:
    

      算法训练 2的次幂表示  :http://lx.lanqiao.org/problem.page?gpid=T235

    应该算是比较经典的递归了,直接调用递归函数即可,比较有意思


    具体思路,将数变为二进制字符串,遍历每一位的字符,若为1则递归输出其位数,由于输出中只有2、2(0)、2(2)以及更高次幂四种情况,因此分四种即可

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <cstring>
    #include <algorithm>  
    #include <iostream>
    using namespace std;
    void fun(int bit){
    	char s[20];
    	if(bit>2){
    	  itoa(bit, s, 2);   //转换成字符串,进制基数为2,i转化为   注意是整型和字符数组之间的转化 
           int len = strlen(s);
           int mark=0;  //标记是否输出+号,因为开始的时候是没有加号的 
           for(int i=0;i<len;i++){
           	 
    	   if(s[i]!='0'){
    		  if(mark==1)
                 cout<<'+';
              cout<<2;
               
    		  if(len-i-1!=1)  //控制()是否输出,如果等于1的话就不输出,因为2的1次方直接输出2就可以了 
    		  cout<<'(';
    		  
    		  fun(len-i-1);	
    		  mark=1;
    		  
    		  
    		  if(len-i-1!=1)
    		  cout<<')';
              } 
           }
           return ;
    	}
    	if(bit==2){
    		cout<<"2";
    		return ;
    	}
    	if(bit==1){
    		cout<<"";
    		return ;
    	}
    	if(bit==0){
    		cout<<"0";
    		return ;
    	}
    }
    
    
    int main()
    {
       int n;
       cin>>n;
       	fun(n);			
    return 0;
    }
    


    下面代码稍微长一点,但是好像理解起来简单点

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <cstring>
    #include <algorithm>  
    #include <iostream>
    using namespace std;
    void fun(int bit){
    	char s[20];
    	if(bit>7){
    	  itoa(bit, s, 2);   //转换成字符串,进制基数为2,i转化为   注意是整型和字符数组之间的转化 
           int len = strlen(s);
           int mark=0;  //标记是否输出+号,因为开始的时候是没有加号的 
           for(int i=0;i<len;i++){	 
    	    if(s[i]!='0'){
    		  if(mark==1)
                 cout<<'+';
              cout<<2;
              if(len-i-1!=1)
    		  cout<<'(';		  
    		  fun(len-i-1);	
    		  mark=1;
    		  if(len-i-1!=1)
    		  cout<<')';
              } 
           }
           return ;
    	}
    	if(bit==7){
    		cout<<"2(2)+2+2(0)";
    		return ;
    	}
    	if(bit==6){
    		cout<<"2(2)+2";
    		return ;
    	}
    	if(bit==5){
    		cout<<"2(2)+2(0)";
    		return ;
    	}
    	if(bit==4){
    		cout<<"2(2)";
    		return ;
    	}
    	if(bit==3){
    		cout<<"2+2(0)";
    		return ;
    	}
    	if(bit==2){
    		cout<<"2";
    		return ;
    	}
    	if(bit==1){
    		cout<<"";
    		return ;
    	}
    	if(bit==0){
    		cout<<"0";
    		return ;
    	}
    }
    
    
    int main()
    {
       int n;
       cin>>n;
       	fun(n);			
    return 0;
    }
    
    






  • 相关阅读:
    移动web技能总结
    canvas绘图基础
    如何自定义滚动条?
    学习笔记-AngularJs(十)
    学习笔记-AngularJs(九)
    硬盘杀手!Windows版Redis疯狂占用C盘空间【转】
    64位win10系统无法安装.Net framework3.5的两种解决方法【转】
    分享一个电子书地址
    阿里、腾讯、百度、华为、京东、搜狗和滴滴最新面试题汇集【转】
    jQuery时间轴
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432021.html
Copyright © 2020-2023  润新知