本文主要是介绍大数问题-打印1到最大的n位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述
输入数字n,按顺序打印出从0到最大的n位十进制数。比如输入4,则需要输出0,,1,2,3,···, 9999
思路
需要注意两点:
- 直接使用int或long类型,当n比较大时会溢出
- 如何快速的判断出到达了最大的n位数
为解决第一点,我们需要使用字符串模拟加法,这样就不会溢出。第二点快速判断到达最大n位数,只需要我们对每次进位位进行判断,看进位位是否是最高位,如果是表示已经到了最大n位数。
代码实现
思路一:直接使用字符串模拟每次+1操作
public class Main {public static void main(String[] args) {int n=4;char[] ch = new char[n];for(int i=0;i<n;i++){ch[i] = '0';}add_1(ch);}/*** 模拟加法*/public static void add_1(char[] ch){// 当到达最大n位数时跳出while(true){// 个位进行0-9依次遍历for(int i=0;i<10;i++){ch[ch.length-1] = (char)('0'+i);print(ch);}for(int i=ch.length-2;i>=0;i--){if(ch[i]!='9'){// 进位位加1ch[i] = (char)(ch[i]+1);// 进位结束跳出break;}else{// 进位位为9,继续进位,当前进位位变为0ch[i] = '0';if(i==0)return;}}}}// 打印函数,从第一个非零位开始打印public static void print(char[] ch){boolean flag = false;for(int i=0;i<ch.length;i++){if(flag){System.out.print(ch[i]);continue;}if(ch[i]!='0'){flag = true;System.out.print(ch[i]);}if(!flag && i==ch.length-1){System.out.print(ch[i]);}}System.out.println();}
}
思路二:使用全排列思路,每位相当于有10种排列可能(0~9)。
借鉴全排列实现如下
public class Main4 {public static void main(String[] args) {char[] ch = new char[4];for(int i=0;i<ch.length;i++){ch[i] = '0';}array(ch, 0);}public static void array(char[] ch,int current){if(current==ch.length-1){for(int i=0;i<10;i++){ch[current] = (char)(i+'0');print(ch);}}else{for(int i=0;i<10;i++){ch[current] = (char)(i+'0');array(ch, current+1);}}}// 打印函数public static void print(char[] ch){boolean flag = false;for(int i=0;i<ch.length;i++){if(ch[i]!='0')flag = true;if(flag)System.out.print(ch[i]);}if(flag)System.out.println();}
}
这篇关于大数问题-打印1到最大的n位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!