打印出从1到最大的n位十进制数,如输入3 打印 1到 999

打印出从1到最大的n位十进制数,如输入3  打印 1到 999

分析:

可能很多人想到直接求出  10的 n次方  ,然后从1打印到该数。这种情况只适合输入比较小的数字  如  1   2    3   4   5  但是当输入100时,肯定无法直接表示该数。

所以,用数组是一个不错的方法   number[n]

换种思路,n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。

类似于树的深度遍历,树的深度为10层,先从第一层遍历到最后一层   ,当最后一层的所有可能选完了之后,回到上一层,上一层改变加1,然后有回到下一层(如下所示)

第一层为 number[0] 有十种选择  从  数字   0   到  数字   9

第二层为number[1]  同样有十种  从 0到 9

........

......

如   输入 3    刚开始

0                            
0                                            
 0

0
             -------》0               -----》回到上层       0  
1            ----》     知道最后9 9 9

0                       0 1 ..9                                               0
1 ..9

这样很容易想到用递归来做,代码如下:

<span style="font-size:18px;">#include<iostream>
#include<string>
using namespace std;
void print_number(char *number)
{
	while(*number=='0'&&*number!='\0') //去掉前面的0,由于采用的递归,将低位看成高位是一样的效果,解是对称的
		++number;
	while(*number!='\0'){
		cout<<*number;
		++number;
	}

	cout<<endl;

}

void buildnumber(char *number,int length,int index)
{
	if(index==length-1)  //注意这里是等于号  不是赋值
	{
		print_number(number);
		return;
	}

	int i;
	for(i=0;i<10;i++)
	{
		number[index+1]=i+'0';   //由于前面以为已经赋值,所以从index+1开始,从0开始,
		buildnumber(number,length,index+1);  //递归调用  当前位赋值,求下一位
	}

}

int main()
{
	int n;
	cout<<"Enter a number"<<endl;
	cin>>n;

	char *number=new char[n+1];
	number[n]='\0';

	int i;
	for(i=0;i<10;i++)
	{
		number[0]=i+'0';          //将第一位赋值0 开始,然后调用build  改变其他位的值  ,当其他位的可能都走完了 从1开始(一个循环)
		buildnumber(number,n,0);
	}

	delete [] number;

	return 0;
}
</span>
时间: 2024-08-26 16:57:34

打印出从1到最大的n位十进制数,如输入3 打印 1到 999的相关文章

打印出从1到最大的n位十进制数

首先这一题会溢出,要考虑的大数问题.所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回顾. #include "stdafx.h" #include <iostream> using namespace std; //输入数字n,按照顺序打印出从1到最大的n位十进制数. bool Increament(char *number); void printNumbe

c 语言 输出1 -n位最大整数

/* 1.打印1到最大的n位数. 题目:输入数字n,按顺序打印出从1到最大的n位十进制数. 比如:输入3,则打印出1.2.3一直到最大的3位数999. [陷阱]:这个题目很容易想到的办法就是先求出最大的数. 然后循环输出就可以了. */ #include<stdio.h>//自己想到的方法,从a[0]-a[n]依次输出每一位,一次只输出某一位的某个数字 int main() { int i = 0,j = 0,k = 0,input=3;//i为控制进位  j为每一位输出(个位,十位等) //

菜鸟系列之C/C++经典试题(十)

打印1到最大的n位数 题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印1, 2, 3,-,999. 方法一: 这道题一看感觉很简单,首先求的n位数的最大值,然一个从1到这个最大值的循环就搞定了, 如果真的就把这样的答案面试官的话, 后果很是严重.首先, 没有考虑到获得的这个最大的数会不会溢出,如果溢出了, 答案肯定不对.这个代码比较简单, 我就不列出来了. 方法二: 很明显, 这道题我们可以用递归做, 就是每当多添加一位时, 我就把所以的都打印一遍连带刚添加的这个位,

【剑指offer】打印1到最大的n位数

题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 此题很容易误入陷阱! //第一次解法,不幸调入陷阱 void print(int n) { if (n<1) { printf("Invalid Input!\n"); return; } long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出 for (int i=0; i<maxNum; i++) { pri

数据结构-打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 分析:本题最关键的部分是当n值非常大的时候会超出数据类型的范围.偷个懒,没有实现打印1,2,3....999.可以利用分割把string分割成char[].然后单个的char转为int再进行加减法,作为输出. /* 剑指offer面试题12 该问题主要考虑到数据非常大超出数据类型的范围 */ #include <iostream> #include <cstring>

代码的完整性:打印1到最大的n位数

输入数字n,按顺序打印出从1到最大的n位十进制数. 比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999. 全排列打印 public class Main { public static void main(String[] args) { Main test = new Main(); int n = 4; int[] arr = new int[n]; test.PrintMaxOfNDigits(arr, 0); } private void PrintMaxOfNDi

打印1到最大的n位数——12

输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3...一直到最大的3位数即999. 其实一看这个题,就可以想到用一个循环来打印,循环次数就为10的n次方减一,即输入3循环999次依次打印出所对应的值.但是,有一个重要的点就是,如果n的值很大,大到溢出了所能表示的最大整型范围的值,比如用long long数据类型都存放不下了要怎么办呢?这就可以考虑,用字符串的形式来表达大数据,反正只是说让打印出来: 程序设计如下: #include <iostream> #inc

【C语言】打印1到最大的n位数

//打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数.比如:输入3,则打印出1.2一直到最大的3位数999 #include <stdio.h> #include <stdlib.h> #include <memory.h> int num[10]; int add(int n) { int isoverflow = 0; int carry = 0; int i; for (i = 9; i >= 10 - n; i--) { num[

C++面试题一大波

//打印1到最大的n位数. //题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如: //输入3,则打印出1.2.3一直到最大的3位数999. //[陷阱]:这个题目很容易想到的办法就是先求出最大的数.然后循环输出就可以了. #include <iostream> #include <string.h> using namespace std; void Grial(char *str, char *s) { if (*s == '\0') { cout <<