第一题:将非负十进制整数n转换成b进制。(其中b=2~16)
递归:
这个题其实就是对于数据n,要将其转换为b进制的数,即是除b取余法,对于每次取余之后得到的数据,对于转换后大于十进制的数,进行特殊处理,用AF对应于1015;最后按相反的顺序输出即可;而在此题中,使用递归方法时,是先递归调用函数,在将相应的字符加入StringBuffer变量s1中即可,恰好利用递归栈,先进后出的特点,直接输出串即为所求数据转换后的进制数的字符串形式。
递归出口:
if(n==0)
{
return;
}
递归体:
if(n>0)
{
f1(n/b,b);
if(n%b<10)
{
s1.append(n%b);
}
else
{
int c=n%b;
switch(c)
{
case 10:
s1.append("A");
break;
case 11:
s1.append("B");
break;
case 12:
s1.append("C");
break;
case 13:
s1.append("D");
break;
case 14:
s1.append("E");
break;
case 15:
s1.append("F");
break;
default:
break;
}
}
}
非递归:即在循环中一直除n取余法即可。
static StringBuffer s2=new StringBuffer();
//非递归
public static void f2(int n,int b)
{
while(n>0)
{
if(n%b<10)
{
s2.append(n%b);
}
else
{
int c=n%b;
switch(c)
{
case 10:
s2.append("A");
break;
case 11:
s2.append("B");
break;
case 12:
s2.append("C");
break;
case 13:
s2.append("D");
break;
case 14:
s2.append("E");
break;
case 15:
s2.append("F");
break;
default:
break;
}
}
n/=b;
}
}
最后得到的是一个StringBuffer变量s2,最后将其翻转字符串即可得到答案;
第二题:
*
任何一个正整数都可以用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为1,2,3的三种特殊情况特殊处理,其他情况再特殊处理,首先找到对于2的t次方最接近n的数字t和对应的2的t次方的值sum;
while(sum<=n)
{
sum*=2;
t++;
}
//找到对于n来说最大的幂次数t和幂次数对应的值sum
sum/=2;
t--;
接下来分两种情况处理:
1.对于sum刚好与n相等的情况,即是刚好是2的次幂数等于n的情况,
if(sum==n)//刚好是2的t次幂等于n的情况
{
System.out.print("2(");
f(t);
System.out.print(")");
}
2.对于其他情况,即要使用加号了,在处理完最大次幂数之后,再递归处理剩下部分:即f(n-sum);
else//其他情况,就要带上加号了
{
System.out.print("2(");
f(t);
System.out.print(")+");
f(n-sum);
}
递归出口:
if(n==1)
{
System.out.print("2(0)");
return ;
}
if(n==2)
{
System.out.print("2");
return ;
}
if(n==3)
{
System.out.print("2+2(0)");
return ;
}
递归体:
int t=0;
int sum=1;
while(sum<=n)
{
sum*=2;
t++;
}
//找到对于n来说最大的幂次数t和幂次数对应的值sum
sum/=2;
t--;
if(sum==n)//刚好是2的t次幂等于n的情况
{
System.out.print("2(");
f(t);
System.out.print(")");
}
else//其他情况,就要带上加号了
{
System.out.print("2(");
f(t);
System.out.print(")+");
f(n-sum);
}
第一题:
测试代码:
测试代码原理:
将相应的十进制的字符串和进制数作为参数传进函数中,即进行一个将b进制数转换为十进制数的反运算过程,将得到的数据与原输入数据比较,相等则说明测试成功。
//以下为测试代码
public static int test(StringBuffer n,int b)//测试代码,将b进制数转换为十进制数
{
int sum=0;
int i=0;
int l=n.length();
int ll=l;
while(l>0&&i<ll)
{
int t=n.charAt(l-1);//获取当前位上的字符
if(t<='9'&&t>='0')
{
sum+=(t-'0')*Math.pow(b,i);
}
else
{
switch(t)
{
case 'A':
sum+=10*Math.pow(b,i);
break;
case 'B':
sum+=11*Math.pow(b,i);
break;
case 'C':
sum+=12*Math.pow(b,i);
break;
case 'D':
sum+=13*Math.pow(b,i);
break;
case 'E':
sum+=14*Math.pow(b,i);
break;
case 'F':
sum+=15*Math.pow(b,i);
break;
default:
break;
}
}
i++;
l--;
}
return sum;
}
运行截图·:
第一题:
第二题:
总结:
此次一开始做题时,对于相应的递归出口没有设计好,出现了栈溢出的情况,对于这种情况,发现是递归调用无出口的问题,一直在递归自身而没有到递归出口的地方,相当于死循环,而栈空间大小是确定的,一旦超过这个界限,即会溢出。
在设计递归结构时,要充分利用栈先进后出的特点