面试题12:打印1到最大的n位数

面试题12
  /*题目:输入数字n,按顺序打印从1到最大的n位十进制数。比如输入2,输出1,2...到最大的2位数99.
  常用的方法是用字符串或数组表示一个大数。
  把字符串中的每个数字初始化为‘0’,每次为字符串表示的数字加1,再打印出来。因而需要:在字符串表达的数字上模拟加法,再就是打印表达的数字。
*/
void Print1ToMaxOfNdigits(int n)
{
if(n<=0)
return;
char *number=new char[n+1];
memset(number,'0',n);
number[n]='\0';

while(!Increment(number))
PrintNumber(number);
delete []number;
}
//需要知道什么时候停止在number上增加1
//注意到只有对'999..99'加1的时候,才会在第一个字符(下标0)的基础上产生进位,其他情况都不会在第一个字符上产生进位。
bool Increment(char* number)
{
bool isOverFlow=false;
int nTakeOver=0;
int length=strlen(number);
for(int i=length-1;i!=-1;--i) //原代码用的是i>=0,修改为i!=-1才有同样的效果。
{
int nSum=number[i]-'0'+nTakeOver;
if(i==length-1)
nSum++;
if(nSum>=10)
{
if(i==0)//第0位上有进位时,溢出为真,停止条件成立。
isOverFlow=true;
else
{
nSum-=10;
nTakeOver=1;
number[i]='0'+nSum;
}
}
else
{
number[i]='0'+nSum;
break;
}
}
return isOverFlow;
}
//当数字不够n位时,数字前面的补0不应该打印出来。
void PrintNumber(char* number)
{
bool isBegining0=true;
int length=strlen(number);
for(int i=0;i!=length;++i)
{
if(isBegining0&&number[i]!='0')
isBegining0=false;
if(!isBegining0)
printf("%c",number[i]);
}
printf("\t");
}
//测试用例包括:功能测试(输入1,2,3),特殊输入测试(0,-1)
//相关题目还有计算两个整数的加法,也要当作大数问题来处理。



package com.testJianZhiOffer;

import java.util.ArrayList;
import java.util.Iterator;
public class OutPutOneToMaxNDigits {
	 
    public void outPutOneToMaxNDigits(int n) {
        // 用nlist表示数n,nlist[0]表示n的最低位
        ArrayList<Integer> nlist = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            nlist.add(0);
        }
        increment(nlist);
    }
 
    // 使数字每次+1然后输出
    public void increment(ArrayList<Integer> nlist) {
        int carrybit = 0;
        boolean end = false;
        int j=0;
        while (true) {
            for (int i = nlist.size() - 1; i >= 0; i--) {
                int digit = nlist.get(i);
                int sum = digit + carrybit;
                if (i == (nlist.size() - 1)) {
                    sum += 1;
                }
                if (sum >= 10) {
                    // 最高位产生进位,达到最大值,停止输出
                    if (i == 0) {
                        end = true;
                    }
                    sum = sum - 10;
                    carrybit = 1;
                } else {
                    carrybit = 0;
                }
                nlist.set(i, sum);
            }
            output(nlist);
            if (end) {
                break;
            }
        }
    }
 
    // 输出数字,将高位的0舍掉
    public void output(ArrayList<Integer> nlist) {
        Iterator<Integer> ite = nlist.iterator();
        int num;
        // 找到第一个为0的位置
        boolean first = false;
        while (ite.hasNext()) {
            if (first) {
                System.out.print(ite.next());
                continue;
            }
            if ((num = ite.next()) != 0) {
                first = true;
                System.out.print(num);
            }
        }
        System.out.println();
    }
    public static void main(String[] args) {
        OutPutOneToMaxNDigits opt = new OutPutOneToMaxNDigits();
        opt.outPutOneToMaxNDigits(2);
         
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值