《剑指offer》-[第3章:高质量的代码- 3.3:代码完整性] 题12:打印1到最大的n位数

1、问题描述

输入n,打印从1到最大的n位十进制数。比如输入的是3,那么依次打印1,2,…,999。

2、解题思路

  • 分析:
  • (1)这里并没有对n的范围具体说明,如果n是一个比较大的数,使用整型int,或者长整型long等数据类型都可能会溢出。也就是说我们得考虑大数问题。
  • (2)表达一个大数最常用的方法是是用字符串或者数组表达大数。所以这道题有两种解法,第一种是使用字符串模拟加法;第二种是采用数组表示,即将该问题转换成数字的排列。
  • 思路1:如果采用转换成数字排列的思路,使用一个长度为n的字符数组,数组中的每一个元素都初始化为’0’。那么接下来我们只需要做两件事:第一是对n位,每位取值范围[0,9]的字符数组做全排列,每一个排列对应一个数字;第二是把数组表达的数字打印出来。全排列具体实现实现可以采用循环加递归(Permutation(char [] array , int length,int currentdepth)
  • 思路2:第二种方法是采用字符串模拟数字加法。这种方法每次在字符数组上加1,然后把它打印出来,直到到最大的n位数停止。所以关键操作是模拟加1,和判断是否到达最大的n位数。判断是否到达最大的n位数可以根据最高位是否产生进位得到,而加1时需要注意,如果遇到999,…,99的情况,即某位加1大于等于10后,就可能会产生连续进位的,需要循环,如果没有产生进位,则循环停止。

3、代码实现

public class Problem_12 {

    char [] number ;
    Problem_12(int length){
        number = new char[length];
        for(int i= 0;i<length;i++){
            number[i] = '0';
        }
    }
    public boolean increment(){
        boolean isoverflow = false;
        int takeover = 0;

        for (int j=number.length - 1; j >=0; j--){
            int bitsum = number[j] - '0' + takeover;
            if(j == number.length - 1){
                bitsum += 1;
            }
            if(bitsum >= 10){
                if(j == 0){
                    isoverflow = true;
                }
                else {
                    bitsum -= 10;
                    takeover = 1;
                    number[j] = String.valueOf(bitsum).toCharArray()[0];
                }
            }
            else {

                number[j] = String.valueOf(bitsum).toCharArray()[0];
                break;
            }
        }
        return isoverflow;
    }
    public void printnumber(){
        System.out.println(String.valueOf(number));
    }
}

4、相关题目

(1)实现任意两个整数数的加法。由于没有限定输入两个数的大小范围,所以应该把它当作大数问题来处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Albert_YuHan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值