题目:
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,一直到最大的3位数即999。
此题看起来简单,当我刚开始看到问题后,首先想到的就是先求出最大值,然后在一个一个打印出就ok啦。但是仔细理解题意,并没有告诉n的取值范围。若n的值非常大,可能就超过了int或者long long的范围。也就是说在做此题时,需要考虑大数。
为解决存大数的问题,我们可以利用数组或者字符串存大数。接下来我用字符串来解决大数问题。
首先,需要考虑两个问题:
(1)在字符串上模拟加法
(2)将字符串中的数字打印出来
程序实现:
模拟加法:
bool inc(char* num,int n)//模拟加法 { int i = 0; int m = 0; int take = 0;//进位 for(i=n-1;i>=0;i--) { m = num[i]-'0'+ take; take = 0;//进位置0 if(i == n-1) //从末尾加 { m++; } if(m >= 10)//产生进位 { if(i == 0)//若最高为溢出,终止 return 0; else { take = 1; num[i] = m - 10 + '0';//进位后,将本位置0 } } else { num[i] = m + '0';//不产生溢出时,在本位上加 } } return true; }
打印:
//void print(char* num,int n) //{ // bool flag = true;//标志位 // int i = 0; // for(i=0;i<n;i++) // { // if(flag && num[i] != '0') // { // flag = false; // } // if(!flag)//若高位不为0,打印 // { // printf("%c",num[i]); // } // } // cout<<" "; //} void print(char* num,int n) { int i = 0; for(i=0;i<n;i++) { if(num[i] != '0') break; } printf("%s",num+i); }
测试:
int main() { int n = 3;//3位数 char* str = new char[n+1];//字符串的最后一位为‘\0’,多开辟一个空间 memset(str,'0',n);//初始化 str[n] = '\0'; while(inc(str,n)) { print(str,n); } delete[] str;//释放空间 str = NULL; return 0; }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。