一个整数,大于0,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。 例:n=1237 则输出为: 1237, 2474, 4948, 9896, 9896, 4948,

思路:

看见该题,首先就可以想的用循环;

输出结果是个对称的,也就会想的递归;

“先进后出”符合栈存储。

因为是二倍关系,也可以使用<<和>>运算符。

下面是其中两种算法:

算法一:

首先想到的就是用循环语句可以完成,该题需要两个循环,一个是递增的,一个是递减的。要定义一个循环变量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的值变了,但不能输出。所以需要再加一个输出语句输出其值。

程序流程图

循环的方法

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值