递归设计(进制问题和二次幂问题)

一:题目要求

题目1:将非负十进制整数n转换成b进制。(其中b=2~16)

题目2:任何一个正整数都可以用2的幂次方表示。例如:

137=27+23+2^0

同时约定幂次方用括号来表示,即ab
可表示为a(b)。

由此可知,137可表示为:

2(7)+2(3)+2(0)

进一步:7=
22+2+20 (21用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+2^0

所以1315最后可表示为:

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

输入:正整数(n≤20000)

输出:符合约定的n的0,2表示(在表示中不能有空格)

输入格式
Input Format

一个正整数

输出格式
Output Format

符合约定的n的0,2表示(在表示中不能有空格)

样例输入
Sample Input

73

样例输出
Sample Output

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

二:题目分析

题目一:将一个十进制数化为其他进制数的方法是:用十进制整数除以N,可以得到一个商和余数,再用商除以N,又会得到一个商和余数,如此进行,直到最后的商比N小时为止,将余数和最后的商从下向上倒序写就是结果。

题目2:

设输入的数为m,当m=1时,输出2(0);当m=2时,输出2;

设一个整数为p,让p*2接近,每乘一次2,n=n+1

若m==p/2时,说明m是一个2次幂,此时n为它的次幂,此时把n-1作为函数的参数,进行递归.

例如第一次递归:m=8,p=16,n=4,Fun(n-1) 输出2()

第二次递归:m=3,p=4,n=2 Fun(m-p/2) 输出2+

第三次递归:m=1 输出2(0)

所以输入整数8时,输出2(2+2(0))

三:代码实现
题目一



package 进制;

import  java.util.Scanner;

public class turn {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);

        System.out.println("请输入十进制整数");

        int a=input.nextInt();//a为十进制整数

        System.out.println("请输入进制数(2--9)");     

        int b=input.nextInt();//b为转化的进制数(2—-9)

         T(a,b);

        

    }

public static void T(int a, int b) {

    if((a/b)>0)

    {

        T(a/b,b);

                System.out.print((a%b));   

    }       

    else

    {System.out.print((a%b));}

    

}

}


题目二:



package zzz;

import
java.util.Scanner;

 

public class z {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);

        System.out.println("输入一个整数");

        int m=input.nextInt();

        Fun(m);

    }

    static void Fun(int m){

        if(m == 2){          //特殊形式单独考虑,递归结束

           
System.out.print("2");

         

           
return;

        }

        if(m == 1){         //特殊形式单独考虑,递归结束

          System.out.print("2(0)");

           
return;

        }

        int p = 1,n = 0;    //n记录幂次,p是一个数,尽量与m接近

        while(p <= m){      //使p与m最接近

           
p *= 2;

           
n++;           //最接近时的幂

        }

        if(m == p/2){        //m正好是一个2次幂,无需带+

          System.out.print("2(");        

           
Fun(n - 1);

           
System.out.print(")");

        }

        else      //m不正好是一个二次幂,需要表示成多项

        {

           
if(p/2==2)      //m是3时,一种特殊情况

           
{

           
  System.out.print("2");

           
  System.out.print("+");

               
Fun(m-p/2);   //可以直接写为Fun(1),因为这种情况本身就是m=3时才使用

           
}

           
else    
//m不是3时的情况

           
{

           
 System.out.print("2(");

               
Fun(n - 1);

               
System.out.print(")+");      
//加另外的项

               
Fun(m - p/2);       //将剩余的再递归求解

           
}
        }
    }   
}

实现效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值