题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
在不考虑大数的情况下,直接循环打印直到最大的数。
在考虑大数的情况下:
1.开辟n+1个空间的char型数组来保存数字,最后一位赋值为‘\0’,并且数字最高位对应数组的0下标;
2.构建函数bool Increment(char * number)实现数字的加1操作并且判断是否溢出;
3.循环调用Increment函数,溢出则终止循环,否则调用Print函数打印数字。
代码如下:
void printtomax(int n) { try { if(n<=0) throw exception("参数不合法!n>0"); char *number=new char[n+1]; memset(number,‘0‘,n*sizeof(char));//先初始化在给最后一位赋值‘\0’ number[n]=‘\0‘; while(!Increment(number))//如果number加1之后没有溢出则打印该数字 { Print(number); } delete[] number; } catch(exception e) { cerr<<e.what()<<endl; } }
实现加一操作的Increment函数:
1.分别用一个标志位(isoverflow)来控制是否溢出,另一个标志位(overstack)来控制是否有进位
2.给数字最低位加1之后,判断它的值是否大于10:
如果大于10,自己-=10,高一位+1,并继续判断高一位和10的大小,依次类推(注意判断当前位是否是最高位,是则溢出)
如果小于10,跳出循环函数返回true
代码如下:
//进行加1操作并判断是否溢出 bool Increment(char * number) { bool isoverflow=false;//判断是否溢出 int overstack=0;//进位标志 int length=strlen(number);//字符串的长度 for(int i=length-1;i>=0;i--) { int digit=number[i]-‘0‘+overstack;//获得当前位上的数字 //如果在个位的话就进行加一 if(i==length-1) { digit++; } //判断加一之后是否需要进位 if(digit>=10) { //如果当前位在最高位的话,溢出 if(i==0) { isoverflow=true; break; } //没有溢出时候,进位标志赋值1,当前位-=10 else { overstack=1; digit-=10; number[i]=‘0‘+digit; continue; } } //加1之后不需要进位,则直接跳出循环 else { number[i]=‘0‘+digit; break; } } return isoverflow; }
打印字符数组中数字的函数的实现(Print):
注意:数组前面是高位,后面是低位,为了区分前面的0还是数字本身的0(例如5位数组00101,前两个0不必打印,第三个0需要打印),需要这是一个标志位(beginprint)来区分
代码如下:
//打印number中存的数字 void Print(char * number) { bool beginprint=false;//区分是前面的0还是数字中的0,为true的话就一直打印下去 int length=strlen(number); for(int i=0;i<length;i++) { if(number[i]!=‘0‘&&(beginprint==false))//如果遇到第一个非0数则设置beginprint为true,开始打印 beginprint=true; if(beginprint) cout<<number[i]; } cout<<" "; }
测试代码及运行结果:
int main() { printtomax(2); return 0; }
时间: 2024-12-14 12:24:46