打印出从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); }