思路:
看见该题,首先就可以想的用循环;
输出结果是个对称的,也就会想的递归;
“先进后出”符合栈存储。
因为是二倍关系,也可以使用<<和>>运算符。
下面是其中两种算法:
算法一:
首先想到的就是用循环语句可以完成,该题需要两个循环,一个是递增的,一个是递减的。要定义一个循环变量x=n;则递增的循环条件是for(;x<=5000;x=x*2);由于该循环只能输出小于5000的整数,根据题目要求,应该再加一条语句输出x的值。递减的循环条件for(;x>=n;x=x/2);这样就可以输出递减的值了。
算法二:
除了循环,也可以用递归方法来解决该题。先写按递增方式的代码,写好递增的以后,再增加考虑递减部分。当n小于5000时,输出n值,然后调用自己传值为2n,当n值大于5000后,就不用继续调用自己了,所以把调用自己的语句写在一个if 语句里,条件就是n小于5000,当不在调用自己时,就继续执行下面的语句,输出n值,结束后返回上一个函数,继续输出n值,以此类推,直至第一次调用的函数结束,程序也就结束了。
package homework;
public class fangfa
{
/**
* @param args
*/
//.一个整数,大于0,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。
/**
* @param args
*/
//方法1:使用循环
public void fangfa1(int n){
int x=n;
for(;x<=5000;x=x*2) //递增输出小于5000的值
System.out.println(x+",");
System.out.println(x+",");//输出唯一一个大于5000的X值
for(;x>=n;x=x/2) //递减输出
System.out.println(x+",");
}
//方法二:使用递归
public void fangfa2(int n) {
System.out.println(n+",");// 先输出n的值,即输出递增部分
if (n <= 5000) fangfa2(n*2);//当n<=5000时,继续调用递归函数count自己,但是实参加倍
System.out.println(n+",");//再次输出n的值,即输出递减部分
}
}
测试类:
package homework;
import java.io.IOException;
import java.util.Scanner;
public class test
{
/**
* @param args
*/
public static void main(String[] args)throws IOException{
// TODO Auto-generated method stub
fangfa fa=new fangfa();//创建一个对象
System.out.println("请输入一个大于0的整数:");
int n;
Scanner x=new Scanner(System.in);//输入一个数n
n=x.nextInt();
if(n>0){
//fa.fangfa1(n);//对象调用fangfa1函数
fa.fangfa2(n);//对象调用fangfa2函数
}
else System.out.println("输入错误,请重新输入!");
}
}
调试和测试:
出错原因:需要输出大于5000的第一个数,第一次的只能输出到小于5000的第一个,虽然x的值变了,但不能输出。所以需要再加一个输出语句输出其值。
程序流程图
循环的方法