• 剑指offer-面试题12.打印1到最大的n位数


    题目:输入数字n,按照打印出从1最大的n位10进制数。比如3,则

    打印出1、2、3一直到最大的3位数即999

    1.你觉得如果面试会有这么简单的题,那

    只能说明你---太天真。

    2.n=3尚可,如果n=30 300呢有这样的内置数据类型

    能包括这么大的数吗?

    3.说白了,这道题就是考察用字符串模拟大数。

    算法思想如下:

    1.分配大小为n+1个字符的内存 初始化为'0' 最后一个''

    2.模拟加法,每一位字符上的范围为'0'-'9'当超过之后进位,

    3.结束条件,当第一位字符发生进位时说明已经遍历到最大了,结束

    代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 bool add(char *nums);
     5 void Print1ToMaxOfNDigits(int n)
     6 {
     7     if(n<=0)
     8         return;
     9 
    10     char *nums=new char[n+1];
    11     memset(nums,'0',n);
    12     nums[n]='';
    13     
    14     int jinwei=0;
    15     bool overflag=false;
    16 
    17     while(!add(nums))
    18     {
    19         int flag=0;
    20         for(int i=0;i<n;i++)
    21         {
    22             if(nums[i]!=0||flag)
    23             {
    24                 flag=1;
    25                 cout<<nums[i];
    26             }
    27         }
    28         cout<<endl;
    29     }
    30 
    31     return;
    32 }
    33 
    34 bool add(char *nums)
    35 {
    36     int len=strlen(nums);
    37     bool ismax=false;
    38     int jinwei=0;
    39 
    40     for(int i=len-1;i>=0;i--)
    41     {
    42         int temp=nums[i]-'0'+jinwei;
    43         if(i==len-1)
    44             temp++;
    45 
    46         if(temp>=10)
    47         {
    48             if(i==0)
    49             {
    50                 ismax=true;
    51             }
    52             else
    53             {
    54                 temp=temp-10;
    55                 jinwei=1;
    56                 nums[i]='0'+temp;
    57             }
    58         }
    59         else
    60         {
    61             nums[i]=temp+'0';
    62             break;
    63         }
    64     }
    65 
    66     return ismax;
    67 }
    68 
    69 int main(int argc, char* argv[])
    70 {
    71     int n;
    72     cout<<"Please input the n: ";
    73     cin>>n;
    74     Print1ToMaxOfNDigits(n);
    75     return 0;
    76 }

    运行结果:

    当然剑指Offer还提到了全排列的方法,有兴趣的读者自行参考

  • 相关阅读:
    Linux 三剑客之SED
    搭建Docker环境
    Docker rabbitmq
    Docker Redis 集群
    Docker Mysql
    lerna 大前端项目代码重用解决方案
    将create-react-app从javascript迁移到typescript
    使用 React hooks 优雅解决 mp3 的播放 和 暂停
    React 代码 Import Svg as ReactComponent 失败
    vue3 自定义 hooks 优雅处理异步调用 ajax
  • 原文地址:https://www.cnblogs.com/vpoet/p/4671524.html
Copyright © 2020-2023  润新知