您的位置:首页 > 职场人生

剑指Offer学习之面试题12 :打印1 到最大的n 位数

2017-05-27 22:39 381 查看


package com.www.OfferToSword;

public class Solution12 {

public static void main(String[] args) {
print(2);
}

public static void print(int n) {
double max = Math.pow(10, n) - 1;
System.out.println(max);
for (double i = 0, j = 1; i <= max; i++, j++) {
System.out.print(i + "\t");
if (j % 10 == 0) {
System.out.print("\n");
}
}
}
}

package com.www.OfferToSword;

public class Solution12_1 {
/**
* 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3 一直到最大的3位数即999。
*
* @param n
*            数字的最大位数
*/
public static void printOneToNthDigits(int n) {
// 输入的数字不能为小于1
if (n < 1) {
throw new RuntimeException("The input number must larger than 0");
}
// 创建一个数组用于打存放值
int[] arr = new int
;
printOneToNthDigits(0, arr);
}

/**
* 输入数字n,按顺序打印出从1最大的n位十进制数。
*
* @param n
*            当前处理的是第个元素,从0开始计数
* @param arr
*            存放结果的数组
*/
public static void printOneToNthDigits(int n, int[] arr) {

// 说明所有的数据排列选择已经处理完了
if (n >= arr.length) {
// 可以输入数组的值
printArray(arr);
} else {
// 对
for (int i = 0; i <= 9; i++) {
arr
= i;
printOneToNthDigits(n + 1, arr);
}
}
}

/**
* 输入数组的元素,从左到右,从第一个非0值到开始输出到最后的元素。
*
* @param arr
*            要输出的数组
*/
public static void printArray(int[] arr) {
// 找第一个非0的元素
int index = 0;
while (index < arr.length && arr[index] == 0) {
index++;
}

// 从第一个非0值到开始输出到最后的元素。
for (int i = index; i < arr.length; i++) {
System.out.print(arr[i]);
}
// 条件成立说明数组中有非零元素,所以需要换行
if (index < arr.length) {
System.out.println();
}
}

/**
* 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3 一直到最大的3位数即999。 【第二种方法,比上一种少用内存空间】
*
* @param n
*            数字的最大位数
*/
public static void printOneToNthDigits2(int n) {
// 输入值必须大于0
if (n < 1) {
throw new RuntimeException("The input number must larger than 0");
}

// 创建一个长度为n的数组
int[] arr = new int
;
// 为数组元素赋初始值
for (int i = 0; i < arr.length; i++) {
arr[i] = 0;
}

// 求结果,如果最高位没有进位就一直进行处理
while (addOne(arr) == 0) {
printArray(arr);
}
}

/**
* 对arr表示的数组的最低位加1 arr中的每个数都不能超过9不能小于0,每个位置模拟一个数位
*
* @param arr
*            待加数组
* @return 判断最高位是否有进位,如果有进位就返回1,否则返回0
*/
public static int addOne(int[] arr) {
// 保存进位值,因为每次最低位加1
int carry = 1;
// 最低位的位置的后一位
int index = arr.length;

do {
// 指向上一个处理位置
index--;
// 处理位置的值加上进位的值
arr[index] += carry;
// 求处理位置的进位
carry = arr[index] / 10;
// 求处理位置的值
arr[index] %= 10;
} while (carry != 0 && index > 0);

// 如果index=0说明已经处理了最高位,carry>0说明最高位有进位,返回1
if (carry > 0 && index == 0) {
return 1;
}

// 无进位返回0
return 0;
}

public static void main(String[] args) {
printOneToNthDigits2(2);
System.out.println();
printOneToNthDigits(2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: