面试题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);
}
}