打印1到最大的n位数——12
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3...一直到最大的3位数即999。
其实一看这个题,就可以想到用一个循环来打印,循环次数就为10的n次方减一,即输入3循环999次依次打印出所对应的值。但是,有一个重要的点就是,如果n的值很大,大到溢出了所能表示的最大整型范围的值,比如用long long数据类型都存放不下了要怎么办呢?这就可以考虑,用字符串的形式来表达大数据,反正只是说让打印出来;
程序设计如下:
#include<iostream>#include<string.h>usingnamespacestd;voidPrintMaxNNum(size_tn){char*num=newchar[n+1];//最后一个字符存放'\0'char*tmp=num;while(tmp<num+n)//初始化字符串将其全部设置为0{*tmp='0';++tmp;}*(tmp--)='\0';//使tmp指向最后一个有效字符char*cur=tmp;while(cur>=num){while(*tmp<'9')//tmp始终在最后一位进行加1并输出{++(*tmp);cout<<cur<<"";}*tmp='0';//当循环结束时tmp恢复为0并且要向高位进位for(inti=1;cur>=num;++i)//用循环来完成在cur到tmp的期间字符表示数字的进位{if((tmp-i)<cur)//当要进的位数不够当前cur所能表示的范围时将cur范围扩大--cur;if(cur>=num){++(*(tmp-i));//进位if(*(tmp-i)<='9')//若进位后不需要再向前进位,则输出并break重新回到最低位{cout<<cur<<"";break;}else//否则向再高位依次进位{*(tmp-i)='0';continue;}}}}cout<<endl;delete[]num;}intmain(){size_tn=3;PrintMaxNNum(n);return0;}
初步的思想就是用两个指针表示数字的范围,一个tmp指针始终处在最低位加1,当需要进位时不停地往cur的方向进位,直到cur超出字符串的范围;
运行程序:
这数字已经够密密麻麻的了,如果设置再大一些比如超出系统数据类型所能表示范围的位数,运算都要耗费些时间,这里就不设置验证了。
《完》
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。