打印1到最大的n位数



面试题12:打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,一直到最大的三位数999

首先这个题目看起来很简单。但是有很多陷阱,比如大数问题,如果n很大,我们考虑要不要用long long类型,再如果long long类型都不可以,我们该如何表示。

我的思路:

  1. 使用字符串来表示数字,这样我们就可以取无限大的n

  2. 在字符串上模拟数字加法;

  3. 打印时将001变成1,去掉前面的零,符合我们的日常习惯。

我的代码如下:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<assert.h>

#include<iostream>

usingnamespace std;

 

void Printf(char *number)

{

   bool flag=false;//

   for(int i=0; i<strlen(number);i++)

   {

      if(flag || number[i] != '0')//当第一个不为零的数进去后,

      {                             // flag就会变成真,后面进去的数

          flag=true;               //的数都会打印起来

          printf("%c",number[i]);

      }

   }

   printf("\n");

}

 

bool Increment(char *number)

{

   int flag=false;

   int flag2=0;//当等于Num==10的时候标记前一位应该加一

   int length=strlen(number);

 

   for(int i=length-1; i>= 0; i--)

   {

      int Num=number[i]-'0'+flag2;

      

      if(i == length-1)//只修改最后一位数,当前一位需要

      {               //   加一时,num不需要加一

         Num+=1;

      }

 

      if(Num >= 10)

      {

          if(i==0)

          {

             flag=true;

             break;

          }

          else

          {

             Num-=10;

             flag2=1;

             number[i]='0'+Num;

          }

      }

      else

      {

          number[i]='0'+Num;

          break;

      }

   }

   return flag;

}

 

void Printf1_n(intn)

{

   assert(n >0);

 

   char *number=newchar[n+1];

   memset(number,'0',n);

   number[n]='\0';

 

   while(! Increment(number))

   {

      Printf(number);

   }

   delete[]number;

}

 

int main()

{

   Printf1_n(2);

   //Printf1_n(3);

   //Printf1_n(5);

   return 0;

 

执行结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值