剑指Offer(第二版)面试题17:打印从1到最大的n位数

来源:互联网 发布:零点有数 知乎 编辑:程序博客网 时间:2024/06/03 15:23

剑指Offer(第二版)面试题17:打印从1到最大的n位数

输入数字n,按顺序打印出从1到最大的n位十进制数。

比如输入3,打印1,2,3一直到最大的3位数即999。

思路

如果面试题是关于n位的整数并且没有限定n的取值范围,或者输入任意大小的整数,那么这道题目很有可能是需要考虑大数问题的。字符串是一种简单、有效表示大数的方法。

代码

  • 在字符串上模拟数字加法的解法,绕过陷阱。如何快速判断在增加了1过后,是否到达了最大的n位数是本题的一个小陷阱。
bool Increment(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;        if(i == nLength - 1)            nSum++;        if(nSum >= 10)        {            if(i == 0)                isOverflow = true;            else            {                nSum -= 10;                nTakeOver = 1;                number[i] = '0' + nSum;            }        }        else        {            number[i] = '0' + nSum;            break;        }    }    return isOverflow;}
  • 把问题转换位数字排列的解法,递归让代码更简洁
#include <iostream>using namespace std;void Print1ToMaxOfNDigits(int n);void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);void PrintNumber(char* number);int main(){    int n;    cin >> n;    while(n != -666)    {        Print1ToMaxOfNDigits(n);        cin >> n;    }     return 0;}void Print1ToMaxOfNDigits(int n){    if(n <= 0)        return;    char* number = new char[n + 1];    memset(number,'0',n);    number[n] = '\0';    for(int i = 0; i < 10; ++i)    {        number[0] = '0' + i;        Print1ToMaxOfNDigitsRecursively(number,n,0);    }    return;}void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){    if(index == length - 1)    {        PrintNumber(number);        return;    }    for(int i = 0; i < 10; ++i)    {        number[index + 1] = '0' + i;        Print1ToMaxOfNDigitsRecursively(number,length,index + 1);    }    return;}void PrintNumber(char* number){    bool isBeginning0 = true;    int len = strlen(number);    for(int i = 0; i < len; ++i)    {        if(isBeginning0 && number[i] != '0')            isBeginning0 = false;        if(!isBeginning0)        {            cout<<number[i];        }    }    if(!isBeginning0)        cout<<'\t';    return;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 祖母是什么意思 祖母什么意思 让祖母怀孕 祖母拼音 曾祖母 祖母英文 祖母的拼音 祖母绿分级体系 祖母绿价格 祖母英语 祖母的葵花 祖母中文字幕 快乐小神仙 小神仙和小仙女 我是神仙在凡间 小樵流水 都市小神仙 木森水淼 小农夫当神仙 截教小徒 睡成神仙 星光不曾眠 无事小神仙 神厨小福贵小蜜蜂 天魔正统 神游小胖 台湾曦曦小神童 小神童洗衣机怎么用 小神童全自动洗衣机 小神童曦曦 小神童论坛 古代小神童的故事 海尔小神童洗衣机使用说明书 魔法小神童加旋粤语 小神童洗衣机不进水 海尔小神童洗衣机不能脱水 海尔小神童洗衣机价格 小神童护眼仪 海尔小神童5公斤 海尔小神童xqb60-7288 小神童洗衣机说明书 小神童洗衣机怎么放水 小小神童洗衣机 海尔全自动洗衣机小神童 小神龙俱乐部 神龙小虎闯江湖