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

首先这一题会溢出,要考虑的大数问题。所以不能用简单的是int类型数来表示(32位无符号int
范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回顾。


#include "stdafx.h"
#include <iostream>
using namespace std;
//输入数字n,按照顺序打印出从1到最大的n位十进制数。
bool Increament(char *number);
void printNumber(char *number);
void prin1ToMaxOfDIgits(int n)
{
if(n<=0)
return ;
char *number=new char[n+1];//还包括‘\0‘
memset(number,‘0‘,n);
number[n]=‘\0‘;

while(!Increament(number)) //每次while一次就打印一个数,如果不溢出就打印
{
printNumber(number);
}
delete []number;
}

bool Increament(char *number)
{
bool isOverflow = false;
int nTakeOver = 0;
int nLength = strlen(number);

for(int i = nLength - 1; i >= 0; i --)
{
int nSum = number[i]-‘0‘+ nTakeOver; //ntakeOver相当于进1位(这是其他位加1的核心之所在),注意这里减了‘0‘,取其增加量,如nsum=0,1,2,3...,不减‘0‘(48),
//下面无法判断
if(i == nLength - 1)
nSum ++; //除了最低位是这样++,其他位都是按照进位的方式改变的,因为每次for循环会遍历
if(nSum >= 10) //只是发生在进位的时候,当发生进位,当前位前一位就增加一个nTakeOver=1
{
if(i==0) //如果是最左边的位,溢出(isOverflow= true)此时不能进位了
isOverflow= true;
else
{
nTakeOver=1; //要进一位,也就是当前位的高一位会自动增加了一个1. 呼应nSum = number[i]-‘0‘+ nTakeOver,下次for循环i会-1,是当前位的高一位
nSum=nSum-10; //当前位增量恢复到0
number[i] = nSum+‘0‘; //同时再转换到+‘0‘位置
}
}
else
{
number[i] = nSum+‘0‘; //增量+‘0‘的位置
break;
}
}
return isOverflow; //返回溢出判断
}

void printNumber(char *number)
{
bool isBeginning0=true;
int nlength=strlen(number);

for (int i=0;i<nlength;i++)
{
if(isBeginning0 && number[i]!=‘0‘) //从左往右,当碰到第一个非0字符的时候就从这里开始打印
isBeginning0=false;
if(!isBeginning0)
cout<<number[i]<<" ";
}
cout<<endl;
}

void main()
{
prin1ToMaxOfDIgits(2);
}

时间: 2024-07-31 16:37:43

打印出从1到最大的n位十进制数的相关文章

打印出从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层,先从第一层遍历到最后一层   ,当最后一层的所有可

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 <<